Un espacio de direcciones de 32 bits significa que tiene espacio para 4 GB de direcciones. Idealmente, al kernel le gusta poder mapear toda la memoria física, toda la memoria de la tarea actual y toda su propia memoria. Si la memoria física por sí sola ocupa todos los 4 GB disponibles, eso no funcionará. Por lo tanto, la memoria física se divide en memoria baja, que se asigna todo el tiempo, y memoria alta, que se debe asignar cuando está en uso. A menos que esté ejecutando un kernel parcheado, en la arquitectura ix86, se dedican 128 MB de espacio de direcciones al código del kernel y las estructuras de datos, y 896 MB se dedican a mapear la memoria física (para un total de 1 GB).
Lectura de antecedentes sobre las complejidades de la administración de la memoria cuando su espacio de direcciones no es cómodamente más grande que su memoria total:
- Alta memoria en la wiki del administrador de memoria de Linux
- Alta memoria en el kernel de Linux en Kernel Trap
- Capítulo de asignación de memoria en LDD3
Extractos de los registros de su 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
Aquí tienes 887 MB de memoria baja:el máximo teórico de 896 MB menos unos pocos MB de búfer DMA (zonas de memoria utilizadas para comunicarse con dispositivos de hardware).
De su memoria física, 3328 MB se asignan a direcciones inferiores a 4 GB y 768 MB se asignan a direcciones superiores a 4 GB (el rango 0x100000000–0x130000000). No tiene acceso a estos 768 MB, lo que explica por qué solo tiene 3242 MB disponibles (4096 MB de RAM menos 768 MB inaccesibles menos 9 MB de búfer DMA menos 75 MB utilizados por el propio kernel para código y datos). No sé por qué el BIOS asigna algo de RAM por encima de la marca de 4 GB, pero como punto de datos, estoy publicando esto desde una PC con 4 GB de RAM que también tiene RAM asignada en 0x100000000–0x130000000.
La asignación de memoria física por encima de 4 GB requiere el uso de PAE. PAE incurre en una pequeña sobrecarga de rendimiento (en particular, requiere estructuras de datos más grandes en el administrador de memoria), por lo que no se habilita sistemáticamente. El kernel de Ubuntu predeterminado se compila sin compatibilidad con PAE. Consigue el -generic-pae
núcleo para poder acceder a hasta 64 GB de RAM.
TL, DR:Linux funciona como se esperaba. El firmware no es tan útil. Obtenga un kernel habilitado para PAE.