Um espaço de endereço de 32 bits significa que você tem espaço para 4 GB de endereços. Idealmente, o kernel gosta de mapear toda a memória física, toda a memória da tarefa atual e toda a sua própria memória. Se a memória física sozinha ocupar todos os 4GB disponíveis, isso não funcionará. Assim, a memória física é dividida em pouca memória, que é mapeada o tempo todo, e alta memória, que deve ser mapeada quando em uso. A menos que você esteja executando um kernel com patches, na arquitetura ix86, 128MB de espaço de endereço são dedicados ao código do kernel e às estruturas de dados, e 896MB são dedicados ao mapeamento da memória física (para um total de 1GB).
Leitura em segundo plano sobre as complexidades do gerenciamento de memória quando seu espaço de endereço não é confortavelmente maior que sua memória total:
- Alta memória no wiki do gerenciador de memória do Linux
- Alta memória no kernel do Linux na Kernel Trap
- Capítulo de mapeamento de memória no LDD3
Trechos dos seus registros do kernel:
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
Aqui você tem 887MB de memória baixa: o máximo teórico de 896MB menos alguns MB de buffers DMA (zonas de memória usadas para se comunicar com dispositivos de hardware).
Da sua memória física, 3328MB são mapeados em endereços abaixo de 4GB e 768MB são mapeados em endereços acima de 4GB (o intervalo de 0x100000000–0x130000000). Você não está obtendo acesso a esses 768MB, o que explica por que você só tem 3242MB disponíveis (4096MB de RAM menos 768MB inacessíveis menos 9MB de buffers DMA menos 75MB usados pelo próprio kernel para código e dados). Eu não sei porque o BIOS mapeia alguma RAM acima da marca de 4GB, mas como um ponto de dados, eu estou postando isso de um PC com 4GB de RAM que similarmente tem RAM mapeada em 0x100000000–0x130000000.
O mapeamento da memória física acima de 4 GB requer o uso de PAE . O PAE incorre em uma pequena sobrecarga de desempenho (em particular, requer estruturas de dados maiores no gerenciador de memória), portanto, ele não é ativado sistematicamente. O kernel padrão do Ubuntu é compilado sem suporte a PAE. Obtenha o -generic-pae
kernel para poder acessar até 64 GB de RAM.
TL, DR: o Linux está funcionando como esperado. O firmware não é tão útil. Obtenha um kernel habilitado para PAE.