1

Linux 2.6.11 コンテキスト スイッチのコアは、次のように簡略化できます。

mov prev,%eax //eax は前のページを指す mov
next, %edx //edx は次の
ページを指す
prev
movl 484(%edx), %esp //次の
movl から esp をロード $1f, 480(%eax) //prev で 1f を保存
pushl 480(%edx) //push 1f
jmp __switch_to
1: popl %ebp
popfl

それでは、__switch_to 内の関連するコードを見てみましょう。これは、eax および edx レジスターから prev_p および next_p パラメーターを取ります。多くの作業を行い、終了します

movl %edi,%eax ret

私の質問は、命令 movl $1f, 480(%eax) を介して $1f を保存する必要があるのはなぜですか? 私の知る限り、アドレス $1f は定数であり、コンパイラによって修正され、実行中に変更されません。したがって、それを保存する意味はありません。また、最も重要なこととして、switch_to マクロはソース コードの 1 か所でのみ使用されます。

2 番目の質問: pushl 480(%edx) 経由で $1 をプッシュした後に __switch_to にジャンプする必要があるのはなぜですか? __switch_to は、呼び出し命令を介して定期的に呼び出すだけで、問題なく $1 に戻ります。

4

0 に答える 0