3

Unixカーネルのモードスイッチの理解について少し混乱しています。私はここで私の理解を与え、議論/修正のためにそれを開きます。

ユーザーモードからカーネルモードに移行している間、プロセッサはプロセスごとのユーザースタックとプロセスごとのカーネルスタックを切り替えます。次に、プロセスごとのユーザースタックセグメントセレクターとスタックポインターがカーネルスタックに格納され、eip命令ポインター(ユーザーモードでのリターンアドレス)とその他のハードウェアレジスタがカーネルスタックにプッシュされます。

カーネルがユーザーモードに戻る必要がある場合、trapretコードはカーネルスタックに格納されているすべての値をハードウェアレジスタにポップバックします。

カーネルスタックから値をポップするtrapret

ただしiret、カーネルスタックからeipをポップする場合、実行する必要がある次の命令は、ユーザーモードのリターンアドレスです。

これは、カーネルスタックの他の値を完全にポップすることなく発生します。

残りの値()はどのよう%cs, %eflags, %esp, %ssに復元されますか?

カーネルスタックに存在するuser-stack-pointerはどのように%espにポップバックされますか?

ユーザーモードからカーネルモードへの移行中のトラップフレーム

4

1 に答える 1

2

iretそのすべてのものを復元します

iret指示は非常に複雑です。Intel アーキテクチャ マニュアルを引用するには:


割り込まれたプロシージャーとは異なる特権レベルから割り込みまたは例外ハンドラーからの戻りを実行する場合、プロセッサーは次のアクションを実行します。

  1. 権限チェックを実行します。
  2. CS および EIP レジスタを、割り込みまたは例外が発生する前の値に復元します。
  3. EFLAGS レジスタを復元します。
  4. SS レジスタと ESP レジスタを、割り込みまたは例外が発生する前の値に復元します。その結果、スタックは、割り込みを受けたプロシージャのスタックに戻ります。
  5. 中断されたプロシージャの実行を再開します。
于 2012-04-01T20:38:02.103 に答える