コンテキスト遷移を正しく理解したら、プロセスには2つの主要なステップが含まれます。
- MMUは、新しいプロセスの仮想メモリ空間を物理メモリ空間にマッピングするように切り替えられる。
- 現在のプロセスのプロセッサ状態を保存し、新しいプロセスの保存されたプロセッサ状態に切り替えます。おそらくこれには、プロセスが最後に停止した場所で実行を開始するようにプログラムカウンタを設定することが含まれます。
カーネルでは、これらすべてを処理する関数をcontext_switch()
(ソースコードはこちら)。この関数は2つの必須ステップを処理しますが、プロセッサの状態を設定した後に返されます。
context_switch()
プログラムカウンタが手動で新しい位置に移動すると、戻ってくる機会がまったくないように見えるため、これは混乱します。私が考えることができる唯一の説明は、これがcontext_switch()
すべて新しいプロセスに切り替えるためのコードであるということです。そして変換プロセスによって返されたコード。つまり、各プロセスは最終的に独自のプロセスからcontext_switch()
別のプロセスに切り替わりますcontext_switch()
。しかし、これが新しく分岐したプロセスにどのように作用するのかわからないようです。それでは、context_switch()
実行が実際に完了して返され、次に他のものがターゲットプロセスの正しい部分にジャンプできますか?
この考えは正しいですか?正確にいつ、context_switch()
あるプロセスから別のプロセスに移動しますか?ときにcontext_switch()
戻ってきた?新しいプロセスに切り替えると、新しいプロセスの実行状態はどこで終了しますか?これは、新しく分岐したプロセスにどのように適していますか?
私はこれを理解しようとして、ここ数日間、カーネルソースコードの関連部分を読んだが、理解するのに近づいていないようです。ここで誰かが助けてくれることを願っています。
答え1
その行のコメントを参照してください。3366(5.7.7以降):
/* Here we just switch the register state and the stack. */
context_switch()
新しいコマンドポインタ(プログラムカウンタ)を直接ロードする代わりにスタックを切り替え、スタックには適切な戻りアドレスが含まれます。関数が返されると、新しいアクションとして返されます。
分岐すると、仮想戻りアドレスは両方のプロセス(親と子)と同じです。違いは戻り値です。