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

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

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

私の知る限り、x86 は highmem と lowmem の分割されたメモリ レイアウトを使用します。

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

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

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

ここで、私の最初の質問は、lowmem が 1:1 マッピング (つまり、物理アドレス + 定数 (0x80000000) => カーネル仮想アドレス) を使用する場合、MMU が仮想から物理へのマッピングを知るためにページ テーブルを調べるのにクロックを費やすのはなぜかということです。可能であれば、lowmem 領域にある場合、物理アドレスを取得するために仮想アドレスからマジック定数を差し引くように MMU ロジックを変更できます。または、頻繁にアクセスされるデータとコードを lowmem に配置する他の理由があるのでしょうか。また、lowmem だけが 1:1 マッピングを使用するのはなぜでしょうか。

2 番目の質問は、「lowmem と highmem のメモリ分割メカニズムは x64 Linux システムにも導入されていますか?」です。

前もって感謝します

答え1

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

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

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

最後の質問です。x64 アーキテクチャでもメモリは lowmem と highmem に分割されていますか? いいえ。PAE メカニズムは、x86 の寿命を延ばすためのちょっとした工夫です。アドレス空間 (物理と仮想の両方) がはるかに大きい x64 では、PAE は必要ありません。

関連情報