Linux ではなぜプロセスごとにカーネル スタックが存在するのでしょうか?

Linux ではなぜプロセスごとにカーネル スタックが存在するのでしょうか?

最近、Linux について学び始めたのですが、いくつか疑問があるので質問させていただきます。

  1. 読んでいるときに、「カーネル スタック」という用語に遭遇しましたが、Linux カーネルがプロセスごとにカーネル スタックを使用する理由がわかりません。

  2. プロセスの実行中、esp レジスタに
    プロセスのカーネル スタックの最上位のアドレスが格納され、それぞれのプロセスのユーザー モード スタックの最上位のアドレスが格納されないのはなぜでしょうか。

答え1

システム コールの結果としてプロセスがカーネル モードに入ると、スタックはユーザー モード スタックからカーネル スタックに切り替えられます。これはカーネルの整合性を保つために行われます。そうしないと、プロセス (別のスレッドなど) がスタックに対して不正な処理を実行する可能性があります。

プロセスの状態を保存するために、各プロセスに個別のカーネル スタックが必要です。タスク スイッチが実行された場合、つまり現在のプロセスがスリープ状態になり、他のプロセスの実行がスケジュールされた場合、状態を保存する必要があります。これが発生すると、レジスタ値 (スタック ポインタ レジスタを含む) が復元され、実行されるプロセスは中断された時点から正確に続行できます。

関連情報