カーネル仮想アドレスレイアウトに関する質問

カーネル仮想アドレスレイアウトに関する質問

x86 および x64 システムでは、カーネルの仮想アドレスレイアウトについて 2 つの質問があります。

私が知る限り、x86はhighmemとlowmemという別々のメモリレイアウトを使用します。

私の理解が正しい場合、highmemとlowmemの唯一の違いは、1:1の仮想アドレスと実際のアドレスマッピングがあるかどうかです。

また、lowmemにはカーネルプログラムによって頻繁にアクセスされるコードとデータが含まれていますが、highmemには頻繁にアクセスされないページテーブルまたはユーザーレベルのプログラムデータも含まれています。

しかし、x86カーネルが仮想アドレス空間を分割して頻繁にアクセスするデータとコードをlowmemに配置する理由は理解できません。その利点は何ですか?カーネルメモリの場所に関係なく、仮想マッピングと物理マッピングを取得するには、ページテーブルワークを呼び出す必要があるようです。そうであれば、highmemとlowmemには利点がないようです。

ここでの最初の質問は、lowmemが1:1のマッピング(物理アドレス+定数(0x80000000)=>カーネル仮想アドレスなど)を使用している場合、MMUは仮想対物理マッピングを理解するためにページテーブルをナビゲートするためにクロックを消費しますなぜなぜですか?可能であれば、MMUロジックを変更して仮想アドレスからマジック定数のみを減算して、物理アドレス(lowmem領域にある場合)を取得できます。それとも、頻繁にアクセスするデータとコードをlowmemに入れる理由は他にありますか?なぜlowmemのみ1:1マッピングを使用するのですか...?

2番目の質問は、「lowmemとhighmemのメモリパーティションメカニズムはx64 Linuxシステムにも配布されていますか?」です。

事前にありがとう

ベストアンサー1

高度なメモリそしてメモリ不足x86プロセッサの物理アドレス拡張に関連しています。このメカニズムにより、プロセッサは従来の4GBの代わりに64GBのメモリを処理できます。ただし、命令セットは変更されず、レジスタとポインタの長さはまだ32ビットであるため、仮想アドレス空間はまだ4 GBに制限されます。マシン命令は常に物理アドレスではなく仮想アドレスを使用します。

その結果、「highmem」は、アドレス指定可能領域にマッピングされるまで直接アドレス指定ができません。これがlowmemだけがhighmemの1:1マッピングを使用する理由です。

次の質問は次のとおりです。ページテーブルをスキップして単純な減算を実行して物理アドレスを取得するためにMMUロジックを単純化できないのはなぜですか? MMUはハードウェアで実装され、ページテーブル(およびTLB)を使用してタスクを実行するように設計されています。ただし、ページテーブルから1つのレベルをスキップしてx86でページサイズを4 kBではなく4 MBにする「ラージ」ページがあります。

最後の質問:x64アーキテクチャのメモリもlowmemとhighmemに分けられますか?いいえ。 PAEメカニズムはx86の寿命を延ばすには少し不安定です。より大きなアドレス空間(物理的および仮想)を持つx64には必要ありません。

おすすめ記事