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.