2010-11-28 19 views
9

私は現在、Robert Loveの「Linuxカーネル開発」を読んでいますが、この組み立てが何をしているのか分かりません。linuxカーネル開発

基本的に、各プロセスカーネルスタックには、スタックの最後にあるstruct thread_infoがあります。さて、x86アーキテクチャ上で、我々は明らかに論理積をとるので、基本的には次のアセンブリに0xffffe000により、スタックポインタを

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

を使用して(8KBのスタックサイズを仮定して)これをつかむことができます。私はここで何が起こっているのか混乱していますか?私はなぜ%espの最下位13ビットをマスキングするのが私たちを構造体に連れて行くのかわかりません。私はそれが説明されたら、私は愚かな気がするだろうが、それは私を悩ましています。

ありがとうございました。

+0

私は現在、この本を読んでおり、もっと基本的な質問があります: '-8192'は' 0xffffe000'ですか?負の数値はCPUのレジスタにどのように格納されますか? –

答えて

5

スタックは下向きに成長するので、スタックの最後はスタック内の最下位アドレスと構造体の開始アドレスになります。スタックは8KBの倍数で格納されます。したがって、最下位13ビットを消去すると、スタックの最下位アドレス、したがって構造体の開始アドレスが得られます。これは理にかなっていますか?

+0

しかし、私は%espがスタックの一番下を指していると思っていましたか? structが最後にスタックにプッシュされると、%espがデクリメントされます。 – tbh

+0

スタックは高メモリアドレスから開始します(スタッフが押されるとスタックポインタが減少します)。 %espはスタックの底部を指し、スタックが成長することができる空間の底部ではなく、 "現在の"底部を指しています。 – lijie

+0

ああ、structがちょうどプロセスが初期化され、それ自身のスタックが与えられたときに、スタックのピット内で右下に押し込まれるのではなく、すべての終わりです。 OK、ありがとう、lijie – tbh

関連する問題