Linux OS では、ページ テーブルを有効にした後、カーネルはカーネル空間に属する PTE を一度だけマップし、二度と再マップしませんか? このアクションは、プロセスの切り替えが発生するたびに再マッピングする必要があるユーザー空間の PTE とは逆ですか?
そこで、カーネル空間とユーザー空間での PTE の管理の違いを知りたいです。
この質問は、次の質問から拡張された部分です: Page table in Linux kernel space during boot
Linux OS では、ページ テーブルを有効にした後、カーネルはカーネル空間に属する PTE を一度だけマップし、二度と再マップしませんか? このアクションは、プロセスの切り替えが発生するたびに再マッピングする必要があるユーザー空間の PTE とは逆ですか?
そこで、カーネル空間とユーザー空間での PTE の管理の違いを知りたいです。
この質問は、次の質問から拡張された部分です: Page table in Linux kernel space during boot
そこで、カーネル空間とユーザー空間での PTE の管理の違いを知りたいです。
これらの関連する質問を参照してください。
これには多くの最適化があり、
各タスクには異なるPGDがありますが、 PTE値はプロセス間で共有される可能性があるため、メモリの大きなチャンクを各プロセスに同じようにマップできます。最上位ディレクトリ (x86 では CR3、ARM では TTB) のみが更新されます。
また、多くの CPU には TLB とキャッシュがあります。これらは、メモリ マッピングで維持する必要があります。一部のキャッシュは、VIVT、VIPT、および PIPT です。最初の 2 つは、PGD や PTE が変更された場合にキャッシュをフラッシュする必要があります。多くの場合、CPU はプロセス、スレッド、またはドメイン ID をサポートします。OS は、コンテキスト スイッチ中にこのレジスタを切り替えるだけで済みます。ハードウェア キャッシュと TLB エントリには、プロセス、スレッド、またはドメイン ID のタグが含まれている必要があります。これは、各アーキテクチャの実装の詳細です。
そのため、最上位ページ レジスタが変更されたときに TLB フラッシュが必要になる可能性があります。これが発生すると、CPU は TLB 全体をフラッシュする可能性があります。ただし、これは、マップされたままのページにとって不利になります。
また、メモリのサブセクションは同じにすることができます。ローダーまたはその他のライブラリを使用mmap
して、プロセス間で同様のコードを作成できます。この共通コードは、アーキテクチャ、ローダー、および Linux のバージョンによっては、ページ テーブル レベルで交換する必要がない場合があります。もちろん、仮想エイリアスを持つこともできますが、それを交換する必要があります。
そして、答えへの最後のポイント。カーネル ページは常にマップされます。非プリエンプティブ OS のみがカーネルをマップできませんでしたが、すべてのプロセスがカーネルを呼び出したいため、それはほとんど意味がありません。マイクロカーネルパラダイムにより、デバイスドライバーが使用されていないときにアンロードできるようになると思います。Linux はモジュールのロードを使用してこれを処理します。