Unixカーネルのモードスイッチの理解について少し混乱しています。私はここで私の理解を与え、議論/修正のためにそれを開きます。
ユーザーモードからカーネルモードに移行している間、プロセッサはプロセスごとのユーザースタックとプロセスごとのカーネルスタックを切り替えます。次に、プロセスごとのユーザースタックセグメントセレクターとスタックポインターがカーネルスタックに格納され、eip
命令ポインター(ユーザーモードでのリターンアドレス)とその他のハードウェアレジスタがカーネルスタックにプッシュされます。
カーネルがユーザーモードに戻る必要がある場合、trapret
コードはカーネルスタックに格納されているすべての値をハードウェアレジスタにポップバックします。
ただしiret
、カーネルスタックからeipをポップする場合、実行する必要がある次の命令は、ユーザーモードのリターンアドレスです。
これは、カーネルスタックの他の値を完全にポップすることなく発生します。
残りの値()はどのよう%cs, %eflags, %esp, %ss
に復元されますか?
カーネルスタックに存在するuser-stack-pointerはどのように%espにポップバックされますか?