Linuxプログラミングインターフェイスは、プロセスの仮想アドレス空間のレイアウトを示しています。
物理メモリのカーネルは完全にまたは部分的にパーツにマッピングされていますか?各プロセスの仮想アドレス空間の上部にある0xC0000000から0XFFFFFFFFの「カーネル」?
部分的である場合、物理メモリのカーネルのどの部分が各プロセスの仮想アドレス空間の「カーネル」部分にマッピングされ、どの部分がマッピングされていませんか?
プロセスの仮想アドレス空間の「カーネル」部分は、カーネルモードで実行しているときにプロセスからアクセスできるカーネルコードの部分を正確に格納しますか。そうでないカーネルコードの部分は格納しませんか?
すべてのプロセスの仮想アドレス空間の「カーネル」部分に同じ内容がありますか?
答えは カーネルページテーブル分離 が有効になっているかどうかによって異なります(これは、アーキテクチャと、KPTIをサポートしているかどうかによって異なります)。
KPTIがない場合、カーネルは各プロセスのアドレス空間に完全にマッピングされますが、図に示されているように、これらのマッピングにはユーザー空間からアクセスできません(サイドチャネルリークがない場合)。
KPTIを使用すると、カーネルページテーブルはユーザー空間ページテーブルから分離され、ユーザー空間がカーネルを呼び出すことができるように、またプロセッサが割り込みまたは例外を処理するときにカーネルを制御します。
どちらの場合も、すべてのプロセスはカーネルに対して同じマッピングを持っています。
カイザーに関するLWNの記事 も参照してください。