web-dev-qa-db-ja.com

すべてのプロセスの仮想アドレス空間の「カーネル」部分に同じ内容がありますか?

Linuxプログラミングインターフェイスは、プロセスの仮想アドレス空間のレイアウトを示しています。

enter image description here

物理メモリのカーネルは完全にまたは部分的にパーツにマッピングされていますか?各プロセスの仮想アドレス空間の上部にある0xC0000000から0XFFFFFFFFの「カーネル」?

部分的である場合、物理メモリのカーネルのどの部分が各プロセスの仮想アドレス空間の「カーネル」部分にマッピングされ、どの部分がマッピングされていませんか?

プロセスの仮想アドレス空間の「カーネル」部分は、カーネルモードで実行しているときにプロセスからアクセスできるカーネルコードの部分を正確に格納しますか。そうでないカーネルコードの部分は格納しませんか?

すべてのプロセスの仮想アドレス空間の「カーネル」部分に同じ内容がありますか?

6
Tim

答えは カーネルページテーブル分離 が有効になっているかどうかによって異なります(これは、アーキテクチャと、KPTIをサポートしているかどうかによって異なります)。

KPTIがない場合、カーネルは各プロセスのアドレス空間に完全にマッピングされますが、図に示されているように、これらのマッピングにはユーザー空間からアクセスできません(サイドチャネルリークがない場合)。

KPTIを使用すると、カーネルページテーブルはユーザー空間ページテーブルから分離され、ユーザー空間がカーネルを呼び出すことができるように、またプロセッサが割り込みまたは例外を処理するときにカーネルを制御します。

どちらの場合も、すべてのプロセスはカーネルに対して同じマッピングを持っています。

カイザーに関するLWNの記事 も参照してください。

7
Stephen Kitt