2010-11-28 6 views
9

Je suis en train de lire 'Linux Kernel Development' de Robert Love et je ne comprends pas ce que fait ce petit assemblage.développement du noyau linux

Fondamentalement, dans chaque pile de processus, il y a un struct thread_info qui se trouve à la fin de la pile. Maintenant, sur l'architecture x86, nous pouvons apparemment saisir (en supposant la taille de la pile de 8 Ko) en utilisant l'ensemble suivant

movl $-8192, %eax 
andl %esp, %eax 

Donc, fondamentalement ANDing le pointeur de la pile par 0xffffe000. Je suis confus quant à ce qui se passe ici? Je ne vois pas pourquoi masquer les 13 bits les moins significatifs de %esp nous amène à la structure. Je sais que je me sentirai stupide une fois qu'on m'expliquera, mais ça m'énerve.

Merci.

+0

Je suis en train de lire ce livre et j'ai une question encore plus fondamentale: comment savez-vous que '-8192' est' 0xffffe000'? Comment les nombres négatifs sont stockés dans les registres du CPU? –

Répondre

5

La pile se développe vers le bas, de sorte que la fin de la pile est l'adresse la plus basse de la pile et l'adresse de début de la structure. Et les piles sont stockées à des multiples de 8KB. Par conséquent, l'effacement des 13 bits les moins significatifs obtient l'adresse la plus basse de la pile et donc le début de la structure. Est-ce que ça a du sens?

+0

Mais je pensais que% esp pointait vers le bas de la pile? Lorsque la structure est poussée vers la pile à la fin,% esp est décrémenté. – tbh

+0

La pile commence à partir d'une adresse mémoire haute (lorsque le contenu est poussé, le pointeur de la pile diminue). % esp pointe vers le bas de la pile, en ce sens qu'elle pointe vers le bas "actuel", plutôt que vers le bas de l'espace dans lequel la pile est autorisée à pousser. – lijie

+0

Ah, je vois que la structure a été poussée juste au la fin de tout plutôt que de simplement l'enfoncer dans la fosse de la pile lorsque le processus est initialisé et donné sa propre pile. OK, merci lijie – tbh

Questions connexes