Linuxのすべてのプロセスにカーネルスタックがあるのはなぜですか?

Linuxのすべてのプロセスにカーネルスタックがあるのはなぜですか?

私は最近Linuxを学び始めましたが、あなたに尋ねたい質問があります。

  1. 読み込み中に「カーネルスタック」という用語に触れましたが、Linuxカーネルがすべてのプロセスにカーネルスタックを使用する理由を理解できませんでした。

  2. プロセスが実行されているとき、espレジスタには
    そのプロセスのカーネルスタックの最上位アドレスがありますが、そのプロセスのユーザーモードスタックの最上位アドレスはなぜありませんか?

答え1

プロセスがシステムコールによってカーネルモードに入ると、スタックはユーザーモードスタックからカーネルスタックに切り替わります。これはカーネルの完全性を維持するために行われます。そうしないと、プロセス(たとえば他のスレッド)がスタックに不快な操作を実行する可能性があります。

各プロセスには、プロセスの状態を保存するために別々のカーネルスタックが必要です。他のプロセスが実行されるようにスケジュールされている間に現在のプロセスがスリープモードになるタスク切り替えを実行している場合は、状態を保存する必要があります。これが発生すると、レジスタ値(スタックポインタレジスタを含む)が復元され、実行中のプロセスが一時停止した正確な位置から続行する可能性があります。

関連情報