2010-11-28 16 views
9

Ich lese gerade 'Linux Kernel Development' von Robert Love und ich verstehe nicht, was dieses Stück der Montage tut.Linux-Kernel-Entwicklung

Grundsätzlich befindet sich in jedem Prozess-Kernel-Stack ein struct thread_info, der sich am Ende des Stacks befindet. Nun, auf der x86-Architektur, können wir offenbar greifen diese (unter der Annahme von 8 KB-Stack-Größe) durch die folgende Montag mit

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

Also im Grunde ANDing der Stapelzeiger durch 0xffffe000. Ich bin verwirrt, was hier vorgeht? Ich verstehe nicht, warum die Maskierung der am wenigsten signifikanten 13 Bits von %esp uns zur Struktur führt. Ich weiß, dass ich mich dumm fühlen werde, sobald es erklärt wird, aber es nervt mich.

Danke.

+0

Ich lese gerade dieses Buch und ich habe noch grundlegendere Frage: Woher weißt du, dass '-8192'' 0xffffe000' ist? Wie werden negative Zahlen in den Registern der CPU gespeichert? –

Antwort

5

Der Stapel wächst nach unten, so dass das Ende des Stapels die niedrigste Adresse im Stapel und die Startadresse der Struktur ist. Und Stapel werden bei Vielfachen von 8 KB gespeichert. Daher erhält das Löschen der 13 niedrigstwertigen Bits die niedrigste Adresse des Stapels und daher den Start der Struktur. Macht das Sinn?

+0

Aber ich dachte% esp zeigte auf die Unterseite des Stapels? Wenn die Struktur am Ende auf den Stapel geschoben wird, wird% esp dekrementiert. – tbh

+0

Der Stapel beginnt mit einer hohen Speicheradresse (wenn der Inhalt verschoben wird, verringert sich der Stapelzeiger). % esp zeigt auf den unteren Teil des Stapels, indem es auf den "aktuellen" Boden und nicht auf den Boden des Raums zeigt, in dem der Stapel wachsen darf. – lijie

+0

Ah, ich dachte, die Struktur wurde nur angeschaltet das Ende von allem, anstatt einfach in die Grube des Stapels geschoben zu werden, wenn der Prozess initialisiert und mit einem eigenen Stapel versehen wird. OK, danke Lijie – tbh