GNU/Linux >> Linux の 問題 >  >> Linux

カーネルがプロセスと同じアドレス空間にマップされるのはなぜですか?

質問の別の部分に答えるために-カーネルは、効率/パフォーマンス上の理由から部分的にすべてのプロセスアドレス空間にマップされます(他にもあると思います)。

最新のほとんどのハードウェアでは、セキュリティ レベルを変更するよりも、システム コールやカーネルが提供するその他の機能を実行するために、セキュリティ レベルを変更する方が迅速です (したがって、Alexey の回答で述べたように、保護されているページへのアクセスを許可します)。仮想メモリ マップ全体、関連するすべての TLB キャッシュ フラッシュ、および完全なコンテキスト スイッチに関連するその他のすべて。

システム コールはかなり頻繁に発生する可能性があるため、Linux や他の多くの場所で進化した設計は、カーネル サービスを利用し、カーネル コードと (少なくとも一部の) データを各プロセスにマッピングするオーバーヘッドを最小限に抑えようとするものです。


プロセスは、仮想アドレス空間全体、カーネルとそのユーザー部分を「所有」します。

カーネルコードとデータを覗き見できないのは、アドレス空間が異なるためではなく、ページテーブルに設定されたアクセス権/許可が異なるためです。カーネル ページは、通常のアプリケーションがアクセスできないように設定されています。

ただし、1 つの全体の 2 つの部分をカーネル空間とユーザー空間と呼ぶのが通例であり、混乱を招く可能性があります。


カーネルが各プロセス アドレス空間にマップされていない場合に何が起こるか想像してみてください。タイマー割り込みが発生すると、プロセッサが IDT (割り込み記述子テーブル) を使用して ISR ルーチンを呼び出すため、トリプル フォールトが発生します。カーネルがマップされていない場合、IDT アドレス無効になり、トリプルフォルトが発生します。


カーネルがプロセス アドレス空間にあると言うもう 1 つの重要な理由は、カーネルが現在のプロセスのユーザー コード/データ、つまり仮想アドレス空間 0~3G にアクセスできることです。

下手な英語でごめんなさい。私は英語のネイティブ スピーカーではありません。


Linux
  1. 子プロセスのPgidが親のPidではないのはなぜですか?

  2. プロセスが親の環境を継承する場合、なぜエクスポートが必要なのですか?

  3. Mate-terminalの複数のインスタンスが同じPidを持っているのはなぜですか?

  1. カーネルがパケットをドロップするのはなぜですか?

  2. Linux –ユーザースペースを決して壊さないLinuxカーネルポリシーがあるのはなぜですか?

  3. Aptがカーネルを更新しなくなったのはなぜですか?

  1. カーネル空間からユーザー空間関数を実行する

  2. Linux カーネルの pr_debug が何も出力しないのはなぜですか?

  3. root ユーザーから Linux カーネルを保護するのはなぜですか?