32位地址空间意味着您有4GB地址的空间。理想情况下,内核喜欢能够映射所有物理内存,当前任务的所有内存以及它自己的所有内存。如果仅物理内存占用了所有可用的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范围)。您无法访问这些768MB,这说明了为什么只有3242MB可用空间(4096MB的RAM减去768MB不可访问的减去9MB的DMA缓冲区再减去内核本身用于代码和数据的75MB)。我不知道为什么BIOS会将一些RAM映射到高于4GB的标记,但是作为数据点,我是从具有4GB RAM的PC上发布该内存的,RAM映射为0x100000000–0x130000000。
映射4GB以上的物理内存需要使用PAE。PAE会产生较小的性能开销(特别是,它在内存管理器中需要更大的数据结构),因此无法系统地启用它。默认的Ubuntu内核是在不支持PAE的情况下编译的。获取-generic-pae
内核 ,使其能够访问多达64GB的RAM。
TL,DR:Linux可以按预期运行。固件不是那么有用。获取启用了PAE的内核。