Uno spazio di indirizzi a 32 bit significa che hai spazio per 4 GB di indirizzi. Idealmente al kernel piace essere in grado di mappare tutta la memoria fisica, tutta la memoria dell'attività corrente e tutta la propria memoria. Se la sola memoria fisica occupa tutti i 4 GB disponibili, non funzionerà. Quindi la memoria fisica è divisa in memoria bassa, che viene mappata continuamente, e memoria alta, che deve essere mappata quando è in uso. A meno che tu non stia eseguendo un kernel con patch, sull'architettura ix86, 128 MB di spazio degli indirizzi sono dedicati al codice del kernel e alle strutture dati e 896 MB sono dedicati alla mappatura della memoria fisica (per un totale di 1 GB).
Lettura di background sulle complessità della gestione della memoria quando il tuo spazio degli indirizzi non è comodamente più grande della tua memoria totale:
- Memoria elevata nel wiki del gestore della memoria di Linux
- Memoria elevata nel kernel Linux su Kernel Trap
- Capitolo sulla mappatura della memoria in LDD3
Estratti dai log del 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
Qui hai 887 MB di memoria insufficiente:il massimo teorico di 896 MB meno alcuni MB di buffer DMA (zone di memoria utilizzate per comunicare con i dispositivi hardware).
Della tua memoria fisica, 3328 MB sono mappati a indirizzi inferiori a 4 GB e 768 MB sono mappati a indirizzi superiori a 4 GB (l'intervallo 0x100000000–0x130000000). Non hai accesso a questi 768 MB, il che spiega perché hai solo 3242 MB disponibili (4096 MB di RAM meno 768 MB inaccessibili meno 9 MB di buffer DMA meno 75 MB utilizzati dal kernel stesso per codice e dati). Non so perché il BIOS mappi una parte della RAM al di sopra dei 4 GB, ma come punto dati, sto postando questo da un PC con 4 GB di RAM che ha una mappatura della RAM pari a 0x100000000–0x130000000.
La mappatura della memoria fisica superiore a 4 GB richiede l'utilizzo di PAE. PAE comporta un piccolo sovraccarico di prestazioni (in particolare, richiede strutture di dati più grandi nel gestore della memoria), quindi non è abilitato sistematicamente. Il kernel predefinito di Ubuntu è compilato senza il supporto PAE. Ottieni il -generic-pae
nocciolo per poter accedere fino a 64 GB di RAM.
TL, DR:Linux funziona come previsto. Il firmware non è così utile. Ottieni un kernel abilitato per PAE.