2011-01-17 1 views
3

C'est ma conjecture:dans le noyau linux, la structure de données thread_struct contient à la fois le champ esp0 et esp, quelle est la différence?

esp0 est initialisé avec l'addr supérieur de pile de noyau. lorsque la pile du noyau est allouée, elle est utilisée, lors du changement de processus, pour initialiser tss-> esp0, de sorte que lorsque le contexte passe du mode utilisateur au mode noyau, la pile du noyau peut être localisée; tandis que esp est utilisé pour sauvegarder la pile du noyau du processus qui doit être planifié pendant le changement de processus.

Donc esp0 dans un thread_struct ne change pas une fois initialisé, alors que esp change.

A mon avis, n'est-ce pas?

Répondre

1

La structure thread_struct contient deux de ces champs ESP, ceux-ci étant esp0 et esp. Cependant, ils concernent les quatre champs dans la structure tss_segment_32, ceux-ci étant esp0, esp1, esp2 et esp.

Celles-ci existent réellement dans le TSS, donc c'est beaucoup quelque chose d'Intel plutôt que quelque chose de Linus et al. Pour savoir pourquoi le TSS les contient, les nombres sont logiques si vous savez comment le modèle de protection fonctionne sous x86. Ils sont, en fait, les niveaux de l'anneau (à l'exception de esp qui est pour le niveau de sonnerie 3 malgré le fait qu'il n'est pas réellement appelé esp3).

En d'autres termes, ils contiennent le pointeur de la pile à utiliser dans l'anneau que vous exécuter en. Comme Linux utilise uniquement l'anneau 0 (mode noyau) et la bague 3 (mode utilisateur), esp0 et esp sont la seule ceux qui ont besoin d'être sauvés.


En aparté, je pense que le seul OS que j'ai jamais vu utiliser un autre anneau était OS/2 qui a utilisé l'anneau 2 pour certaines opérations d'E/S. Les processus qui étaient autorisés à effectuer ces opérations devaient être spécialement marqués et le système d'exploitation les exécuterait dans l'anneau 2 pour permettre un accès d'E/S sans entrave, sans être autorisé à faire tomber le noyau.

Questions connexes