32-разрядное адресное пространство означает, что у вас есть место для 4 ГБ адресов. В идеале ядру нравится иметь возможность отображать всю физическую память, всю память текущей задачи и всю свою собственную память. Если только физическая память занимает все 4 ГБ, это не сработает. Таким образом, физическая память делится на низкую память, которая отображается все время, и большую память, которая должна отображаться при использовании. Если вы не используете исправленное ядро, в архитектуре ix86 128 МБ адресного пространства отводится для кода ядра и структур данных, а 896 МБ - для отображения физической памяти (всего 1 ГБ).
Фоновое чтение о сложностях управления памятью, когда ваше адресное пространство не намного больше, чем ваша общая память:
Выдержки из журналов вашего ядра:
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
Здесь у вас 887 МБ нехватки памяти: теоретический максимум 896 МБ минус несколько МБ буферов DMA (зоны памяти, используемые для связи с аппаратными устройствами).
Из вашей физической памяти 3328 МБ отображается по адресам ниже 4 ГБ, а 768 МБ - по адресам выше 4 ГБ (диапазон 0x100000000–0x130000000). Вы не получаете доступ к этим 768 МБ, что объясняет, почему у вас есть только 3242 МБ (4096 МБ ОЗУ минус 768 МБ недоступно, минус 9 МБ буферов DMA минус 75 МБ, используемых самим ядром для кода и данных). Я не знаю, почему BIOS отображает объем ОЗУ выше отметки 4 ГБ, но в качестве точки данных я выкладываю это с ПК с 4 ГБ ОЗУ, который также имеет ОЗУ, отображаемое в 0x100000000–0x130000000.
Для отображения физической памяти объемом более 4 ГБ необходимо использовать PAE . PAE влечет за собой небольшое снижение производительности (в частности, требует больших структур данных в диспетчере памяти), поэтому он не включен систематически. Ядро Ubuntu по умолчанию скомпилировано без поддержки PAE. Получите -generic-pae
ядро, чтобы иметь доступ к 64 ГБ ОЗУ.
TL, DR: Linux работает как положено. Прошивка не очень полезна. Получить ядро с поддержкой PAE.