32 ビットのアドレス空間は、4 GB のアドレス用のスペースがあることを意味します。理想的には、カーネルは、すべての物理メモリ、現在のタスクのすべてのメモリ、およびすべての独自のメモリをマップできることを好みます。物理メモリだけで利用可能な 4 GB をすべて占有する場合、それは機能しません。したがって、物理メモリは、常にマップされる低メモリと、使用時にマップする必要がある高メモリに分割されます。パッチが適用されたカーネルを実行していない限り、ix86 アーキテクチャでは、128MB のアドレス空間がカーネル コードとデータ構造に割り当てられ、896MB が物理メモリのマッピングに割り当てられます (合計 1GB)。
アドレス空間が総メモリよりも十分に大きくない場合のメモリ管理の複雑さに関する背景知識:
- Linux メモリ マネージャー wiki のハイ メモリ
- カーネル トラップでの Linux カーネルの高メモリ
- LDD3 のメモリ マッピングの章
カーネル ログからの抜粋:
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 の範囲) にマップされます。これらの 768MB にはアクセスできません。これは、なぜ 3242MB しか利用できないかを説明しています (4096MB の RAM から 768MB のアクセス不能を差し引いて 9MB の DMA バッファを差し引いて、カーネル自体がコードとデータに使用する 75MB を差し引いたものです)。 BIOS が 4GB マークを超える RAM をマップする理由はわかりませんが、データ ポイントとして、同様に RAM が 0x100000000–0x130000000 にマップされている 4GB の RAM を搭載した PC から投稿しています。
4GB を超える物理メモリをマッピングするには、PAE を使用する必要があります。 PAE はパフォーマンスのオーバーヘッドが小さい (特に、メモリ マネージャーでより大きなデータ構造を必要とする) ため、体系的に有効化されていません。デフォルトの Ubuntu カーネルは、PAE サポートなしでコンパイルされます。 -generic-pae
を入手 カーネル 最大 64 GB の RAM にアクセスできます。
TL,DR:Linux は期待どおりに動作しています。ファームウェアはあまり役に立ちません。 PAE 対応のカーネルを入手してください。