[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