Perché Linux mostra più e meno memoria di quella che ho installato fisicamente?


11

Conosco lo swap: questa domanda non riguarda questo. In dmesg, il kernel Linux (x86-64) mi dice questo su quanta memoria ho:

[    0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)

cat /proc/meminfo mi dice che ho

MemTotal:        3910472 kB

E dai miei calcoli, penso che dovrei avere esattamente 4 * 1024 * 1024 = 4194304k RAM. Che è molto più piccolo della seconda cifra nella riga dmesg sopra!

Cosa c'è con tutte queste diverse figure?

A proposito, uname -aproduce:

Linux pavilion 3.2.2-1.fc16.x86_64 #1 SMP Thu Jan 26 03:21:58 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Risposte:


20

Dovresti leggere i dmesgvalori "Memory Akb / Bkb disponibili" come:

C'è A disponibile per l'uso in questo momento, e il numero di frame di pagina più alto del sistema moltiplicato per la dimensione della pagina è B.

Questo proviene da arch/x86/mm/init_64.c:

printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
                 "%ldk absent, %ldk reserved, %ldk data, %ldk init)\n",
                 nr_free_pages() << (PAGE_SHIFT-10),
                 max_pfn << (PAGE_SHIFT-10),
                 codesize >> 10,
                 absent_pages << (PAGE_SHIFT-10),
                 reservedpages << (PAGE_SHIFT-10),
                 datasize >> 10,
                 initsize >> 10);

nr_free_pages()restituisce la quantità di memoria fisica, gestita dal kernel, che non è attualmente in uso. max_pfnè il numero di frame della pagina più alto (lo PAGE_SHIFTspostamento lo converte in kb). Il numero di frame della pagina più alto può essere (molto) più alto di quanto ci si possa aspettare: la mappatura della memoria effettuata dal BIOS può contenere buchi.
La quantità di questi buchi è rilevata dalla absent_pagesvariabile, visualizzata come kB absent. Ciò dovrebbe spiegare la maggior parte della differenza tra il secondo numero nell'output "disponibile" e la RAM installata effettiva.

È possibile grep per BIOS-e820in dmesgdi "vedere" questi fori. La mappa di memoria viene visualizzata lì (proprio all'inizio dmesgdell'output dopo l'avvio). Dovresti essere in grado di vedere a quali indirizzi fisici hai una RAM reale e utilizzabile.
(Altre stranezze x86 e aree di memoria riservate probabilmente rappresentano il resto - non conosco i dettagli lì.)

MemTotalin /proc/meminfoindica la RAM disponibile per l'uso. Proprio alla fine della sequenza di avvio, il kernel libera i initdati di cui non ha più bisogno, quindi il valore riportato /proc/meminfopotrebbe essere leggermente superiore a quello che il kernel stampa durante le parti iniziali della sequenza di avvio.

( meminfoutilizza indirettamente totalram_pagesper quel display. Per x86_64, anche questo viene calcolato arch/x86/mm/init_64.ctramite il free_all_bootmem()quale si trova mm/bootmem.cper i kernel non NUMA.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.