Dovresti leggere i dmesg
valori "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_SHIFT
spostamento 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_pages
variabile, 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-e820
in dmesg
di "vedere" questi fori. La mappa di memoria viene visualizzata lì (proprio all'inizio dmesg
dell'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ì.)
MemTotal
in /proc/meminfo
indica la RAM disponibile per l'uso. Proprio alla fine della sequenza di avvio, il kernel libera i init
dati di cui non ha più bisogno, quindi il valore riportato /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 quel display. Per x86_64, anche questo viene calcolato arch/x86/mm/init_64.c
tramite il free_all_bootmem()
quale si trova mm/bootmem.c
per i kernel non NUMA.)