Conosco lo scambio:questa domanda non riguarda questo. In dmesg, il kernel Linux (x86-64) mi dice 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 secondo i miei calcoli, penso che dovrei avere esattamente 4*1024*1024=4194304k di RAM. Che è modo inferiore alla seconda cifra nella riga dmesg sopra!
Che cosa sono tutte queste diverse figure?
A proposito, uname -a
uscite:
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
Risposta accettata:
Dovresti leggere il dmesg
valori “Memoria Akb/Bkb disponibile” come:
Al momento è disponibile A per l'uso e il numero di frame di pagina più alto del sistema moltiplicato per le dimensioni 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 (il PAGE_SHIFT
shift lo converte in kb). Il numero di frame di pagina più alto può essere (molto) superiore a quello che potresti aspettarti:la mappatura della memoria eseguita dal BIOS può contenere buchi.
Quanto occupano questi buchi è tracciato da absent_pages
variabile, visualizzata come kB absent
. Questo dovrebbe spiegare la maggior parte della differenza tra il secondo numero nell'output "disponibile" e la RAM installata effettiva.
Puoi grep per BIOS-e820
in dmesg
per “vedere” questi buchi. La mappa della memoria viene visualizzata lì (proprio nella parte superiore di dmesg
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 spiegano il resto, non conosco i dettagli lì.)
MemTotal
in /proc/meminfo
indica la RAM disponibile per l'uso. Proprio alla fine della sequenza di avvio, il kernel libera init
dati non servono più, quindi il valore riportato in /proc/meminfo
potrebbe essere leggermente superiore a quello che il kernel stampa durante le parti iniziali della sequenza di avvio.
(meminfo
utilizza indirettamente totalram_pages
per quella visualizzazione. Per x86_64, questo è calcolato in arch/x86/mm/init_64.c
anche tramite free_all_bootmem()
che a sua volta è in mm/bootmem.c
per kernel non NUMA.)