32ビットのアドレス空間は、4 GBのアドレス用のスペースがあることを意味します。理想的には、カーネルは、すべての物理メモリ、現在のタスクのすべてのメモリ、およびそれ自体のすべてのメモリをマップできることを望んでいます。物理メモリだけで使用可能な4GBをすべて使用すると、それは機能しません。したがって、物理メモリは、常にマップされるローメモリと、使用時にマップする必要があるハイメモリに分けられます。パッチを当てたカーネルを実行していない限り、ix86アーキテクチャでは、128MBのアドレス空間がカーネルコードとデータ構造に使用され、896MBが物理メモリのマッピングに使用されます(合計1GB)。
アドレス空間が総メモリよりも快適に大きくない場合のメモリ管理の複雑さに関する背景知識:
カーネルログからの抜粋:
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 00000000cdce0000 (usable)
BIOS-e820: 00000000cdce0000 - 00000000cdce3000 (ACPI NVS)
BIOS-e820: 00000000cdce3000 - 00000000cdcf0000 (ACPI data)
BIOS-e820: 00000000cdcf0000 - 00000000cdd00000 (reserved)
BIOS-e820: 00000000d0000000 - 00000000e0000000 (reserved)
BIOS-e820: 00000000fec00000 - 0000000100000000 (reserved)
BIOS-e820: 0000000100000000 - 0000000130000000 (usable)
2404MB HIGHMEM available.
887MB LOWMEM available.
Zone PFN ranges:
DMA 0x00000000 -> 0x00001000
Normal 0x00001000 -> 0x000377fe
HighMem 0x000377fe -> 0x000cdce0
ここに887MBの低メモリがあります。理論上の最大値は896MBから数MBのDMAバッファ(ハードウェアデバイスとの通信に使用されるメモリのゾーン)を差し引いたものです。
物理メモリのうち、3328MBは4GB未満のアドレスにマップされ、768MBは4GBを超えるアドレスにマップされます(0x100000000〜0x130000000の範囲)。これらの768 MBにアクセスできません。これは、3,242 MBしか利用できない理由を説明しています(4096 MBのRAMから768 MBにアクセスできず、9 MBのDMAバッファーを差し引いて、カーネル自体がコードとデータに使用している75 MB)。BIOSが4 GBマークを超えるRAMをマップする理由はわかりませんが、データポイントとして、RAMが0x100000000–0x130000000に同様にマップされている4 GBのRAMを搭載したPCからこれを投稿しています。
4GBを超える物理メモリをマッピングするには、PAEを使用する必要があります。PAEは小さなパフォーマンスオーバーヘッドが発生するため(特に、メモリマネージャーでより大きなデータ構造が必要になるため)、体系的に有効化されていません。デフォルトのUbuntuカーネルは、PAEサポートなしでコンパイルされています。取得-generic-pae
カーネルが RAMの64ギガバイトまでアクセスできるようにします。
TL、DR:Linuxは期待どおりに動作しています。ファームウェアはそれほど役に立ちません。PAE対応のカーネルを入手します。