[SOS] Pbs de compréhension sur la segmentation et les interruptions
David Decotigny
david.decotigny at free.fr
Ven 17 Déc 16:07:57 CET 2004
Bonjour,
BRICEFOURNIER at aol.com wrote:
> J'espère être clair dans mes points obscurs.
Je crains d'etre ni clair, ni exact dans ce qui suit. Peut-etre Thomas
pourra corriger et/ou completer.
> 1/ SEGMENTATION : La première concerne les LDT et se pose sur plusieurs
> points des LDT. Vous précisez que le registre "ldtr"
> contient l'adresse et la taille de la LDT courante. Qu'est-ce que la LDT
> courante?
Petit détail d'abord : dans SOS on n'utilise pas de LDT. On se contente
de la GDT. En general la GDT sert a definir des segments globaux a tout
le systeme. Ensuite, il peut y avoir plusieurs LDT dans le systeme, en
general on passe de l'une a l'autre quand on passe d'une tache a
l'autre. Ca veut dire qu'on aura un jeu de segments global a tout le
systeme (p.ex segments texte/donnees du noyau), et un jeu de segments
propre a chaque tache (p.ex segments texte/donnees de l'appli
utilisateur). Avec SOS, on a choisi de ne pas multiplier les segments,
se contentant d'un unique segment 0-4G, et utilisant la pagination pour
isoler les applis les unes des autres en memoire.
Bref, pour te repondre : lorsqu'on a du multitache, le processeur
execute une appli pdt un certain temps, puis une autre appli (voir Linux
Mag de Janvier)... La "LDT courante" c'est la LDT de la tache en cours.
Ca correspond donc au jeu de segments propre a la tache en cours. Encore
une fois, dans SOS il n'y a pas de LDT, les segments sont les memes pour
tout le monde ; puisqu'on est en modele "flat", il s'agit des adresses
logiques 0-4Go pour tout le monde, point. Donc au niveau segmentation
dans SOS, c'est comme si on n'utilisait rien.
Par contre, nous le verrons plus tard, il y aura quand meme
"cloisonnement" memoire d'une application a l'autre, mais grace a la
pagination seulement (ie l'adresse logique 'A' d'une application ne
correspondra pas a la meme adresse physique que l'adresse logique 'A'
d'une autre application, bien que les adresses linéaires soient egales
puisqu'on est en modele flat sans LDT).
Pour tous les details, voir le chapitre 3 du volume 3 des specs x86 Intel.
> Dépend-elle du programme en cours d'exécution?
Si on estime que 1/ on utilise des LDT, et 2/ qu'il y a 1 LDT par tache
dans le systeme, alors : voui (cf supra). Si on n'utilise pas de LDT
(cas de SOS), la question ne se pose pas.
> Qui modifie le registre ldtr pour spécifier la LDT courante?
L'OS au moment de faire le "changement de contexte memoire". Dans le
Linux Mag du mois de Janvier, on parle du changement de contexte au sens
"passer d'un thread noyau a un autre", tous les threads noyau partageant
tous le meme "contexte memoire". Nous verrons plus tard (Mars je pense)
comment rajouter la partie "changement de contexte memoire" : ca
n'apparaitra qu'avec la notion d'"espace utilisateur" dans le cas de SOS.
> Et comment récupérer l'adresse de la LDT courante pour la mettre
> dans le registre?
Pour positionner la LDTR, on peut utiliser l'instruction LLDT. Il faut
passer a cette instruction non pas une adresse, mais un selecteur de
segment. Car en fait une LDT est un segment particulier de la GDT. Ceci
signifie en particulier qu'il y a une limite dure si on souhaite qu'il y
ait 1 LDT par tache : vu qu'il y a au max 8191 entrees dans la GDT, il y
a au plus 8191 taches possibles "en meme temps" dans le systeme. Cette
limite est genante sur le principe, meme si en pratique on ne
l'atteindra jamais.
> Ou sont stockées toutes les adresses des LDT pour
> retrouver celle dont on a besoin?
Meme si on n'a pas de LDT dans SOS, tu vas trop vite. C'est lie au
multitache. Pour passer d'une tache a l'autre, il faut bien
"photographier" l'etat d'une tache pour le sauvegarder qqpart avant de
passer a une autre tache. Dans cet etat figurent les registres qui sont
propres a chaque tache, qu'on doit sauvegarder qqpart en memoire. Donc
de toute facon, pour chaque tache interrompue, on a qqpart en memoire
des donnees relatives a l'etat de la tache interrompue.
Si on utilisait des LDT, il faudrait en plus sauvegarder le LDTR de la
tache a photographier et le stocker parmi ces donnees. Attends l'article
de Janvier, on parle de cette histoire de changement de contexte, tu
pourra t'amuser a rajouter la sauvegarde du LDTR si tu veux (attends
plutot Fevrier pour ça en fait).
> 2/ INTERRUPTIONS : Ma deuxième interrogation intervient au niveau des
> interruptions non-interruptibles.
> Que devient une interruption qui arrive alors qu'une intérruption est en
> traitement et est non-interruptible?
> (de même pour une interruption
> moins prioritaire que celle en cours de traitement)
> Est-elle mise en attente (si oui par quelle mécanisme? dans quel
> registre?) ou bien est-elle perdue?
C'est le controleur d'interruption (PIC ou APIC sur x86) qui la met "en
attente" : en attente que le CPU acquitte toutes les autres IRQs plus
prioritaires. On pourrait detailler l'interraction PIC/CPU ici mais le
principe c'est qu'aucune interruption "/distincte/" ne soit perdue (si
je recois l'IRQ 11 et l'IRQ 12 alors que je suis en train de traiter
l'IRQ 0, alors les IRQ 11 et 12 sont mises en reserve en attendant que
le CPU acquitte l'IRQ 0). Par contre si on recoit plusieurs fois la meme
IRQ avant de pouvoir la traiter, alors elle ne sera traitee qu'une seule
fois (ie le CPU ne percevra l'IRQ qu'une seule fois). C'est lie au fait
que le PIC gere les interruptions en attente sous la forme d'un bitmap
et pas sous la forme d'une serie de compteurs.
> 3/ INTERRUPTIONS : Ma dernière question concerne la structure d'entrées
> de l'IDT. Pouvez-vous me précisez à quoi servent les 3 champs suivants
> svp, je ne les comprends pas bien :
> - reserved
> - flags
> - zero
Voir sous-figure "interrupt gate" de la figure 5.2 du chapitre 5.9 du
volume 3 des specs Intel x86. C'est la traduction directe de cette
figure. "reserved" est reserve par Intel (ils conseillent de le
positionner a 0), "flags" correspond à la valeur binaire "000" attendue
par le "Interrupt gate" (voir figure), "zero" est un bit a 0 dans la
structure d'un interrupt gate (voir figure).
Bonne journee,
--
David Decotigny -- http://david.decotigny.free.fr
Plus d'informations sur la liste de diffusion Sos