GNU/Linux >> Linux Esercitazione >  >> Linux

Perché il mio sistema mostra solo 3,2 GiB di RAM quando ho sicuramente 4,0 GiB

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.


Linux
  1. Perché popen() invoca una shell per eseguire un processo?

  2. Perché malloc() chiama mmap() e brk() in modo intercambiabile?

  3. Perché il mio sistema Linux balbetta a meno che non elimini continuamente le cache?

  4. Perché il comando free e dmidecode mostrano valori diversi per la RAM?

  5. Il sistema si blocca quando esaurisce la memoria

Perché "ls -all" mostra l'ora per alcuni file ma solo l'anno per altri?

In `mentre Ifs=Leggi..`, perché Ifs non ha alcun effetto?

Linux:il sistema si blocca quando esaurisce la memoria?

Perché Shotwell ha le posizioni X e Y invertite quando si utilizza Crop?

quali processi killer ha Linux?

Perché slabtop -o restituisce solo le prime 23 righe quando il comando viene reindirizzato?