カーネルページテーブルはどのプロセスでどのように共有されますか?

カーネルページテーブルはどのプロセスでどのように共有されますか?

たとえば、x86では、カーネルが各プロセスアドレス空間にどのようにマッピングされるかをよりよく理解し、カーネルアドレスがマッピングされる内容を変更すると、すべてのプロセスとすべてのコアで変更できるように努めています。具体的な例を挙げるために、プロセスAのシステムコール中にカーネルアドレス0xC0000004がページフレーム1000にマッピングされると仮定する。

私の質問は:複数のコアで同時に実行できるプロセスBとCだけでなく、現在実行されていないプロセスに対してこれらのマッピングをどのように更新しますか?

すべてのプロセスがカーネルページテーブルの中央セットのみを「指定」/参照する方法があるとします。したがって、その中央位置の更新は、すべてのプロセスに対する変更を意味します。しかし、各コアに独自のMMUがある場合、マルチコアシステムはそれをどのように処理しますか?例を含む練習は非常に役立ちます。ありがとうございます。

ベストアンサー1

ページテーブル階層が答えです。 Linuxページテーブルは複数のレベルに分かれています。これは、ページテーブルをドリルダウンして有効なページテーブルを見つけるときにスペース最適pte化と見なされます(フルプロセスアドレス空間ではなくページテーブルのみが有効なメモリ位置を格納します)。 。ただし、カーネルの場合、これはプロセス間で既存のカーネルページテーブルマッピングを再利用できることを意味し、パフォーマンスの最適化でもあります。

カーネルマップの更新は、最初に考えるほど重要ではありません。通常、カーネルアドレス空間の変更例は、各プロセスに対してページグローバルディレクトリ(PGD)の下のレベル(最も高いページテーブルレベル)で発生するためです。カーネルページテーブルの分離の説明からわかるように(KPTI)、プロセスのページグローバルディレクトリからカーネルマッピングを削除できる場合、プロセスはどのカーネルコードにもアクセスできないはずです。これは、すべてのプロセスPGDが同じ低レベルのカーネルページテーブルを指すことを意味します。コアが 1 つしかないと仮定すると、これらのサブページテーブルのすべてのカーネルメモリ更新は、メモリの単一更新としてすべてのプロセスに表示されます。もちろん、このアップデートはすべてのCPUに伝播する必要がありますが、これは一般的なキャッシュ一貫性アップデートです。コンピュータで実行されているすべてのプロセスのマッピングを手動で更新するよりもはるかに集中的ではありません。

おすすめ記事