
最近、Linux について学び始めたのですが、いくつか疑問があるので質問させていただきます。
読んでいるときに、「カーネル スタック」という用語に遭遇しましたが、Linux カーネルがプロセスごとにカーネル スタックを使用する理由がわかりません。
プロセスの実行中、esp レジスタに
プロセスのカーネル スタックの最上位のアドレスが格納され、それぞれのプロセスのユーザー モード スタックの最上位のアドレスが格納されないのはなぜでしょうか。
答え1
システム コールの結果としてプロセスがカーネル モードに入ると、スタックはユーザー モード スタックからカーネル スタックに切り替えられます。これはカーネルの整合性を保つために行われます。そうしないと、プロセス (別のスレッドなど) がスタックに対して不正な処理を実行する可能性があります。
プロセスの状態を保存するために、各プロセスに個別のカーネル スタックが必要です。タスク スイッチが実行された場合、つまり現在のプロセスがスリープ状態になり、他のプロセスの実行がスケジュールされた場合、状態を保存する必要があります。これが発生すると、レジスタ値 (スタック ポインタ レジスタを含む) が復元され、実行されるプロセスは中断された時点から正確に続行できます。