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