Debe leer los dmesg
valores "Memoria Akb / Bkb disponible" como:
Hay A disponible para usar en este momento, y el número de marco de página más alto del sistema multiplicado por el tamaño de página es B.
Esto es de 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()
devuelve la cantidad de memoria física, administrada por el núcleo, que no está actualmente en uso. max_pfn
es el número de marco de página más alto (el PAGE_SHIFT
cambio lo convierte a kb). El número de marco de página más alto puede ser (mucho) más alto de lo que cabría esperar: la asignación de memoria realizada por el BIOS puede contener agujeros.
La absent_pages
variable rastrea cuánto ocupan estos agujeros , que se muestra como kB absent
. Esto debería explicar la mayor parte de la diferencia entre el segundo número en la salida "disponible" y la RAM instalada real.
Puede grep para BIOS-e820
en dmesg
"ver" estos agujeros. El mapa de memoria se muestra allí (justo en la parte superior de la dmesg
salida después del arranque). Debería poder ver en qué direcciones físicas tiene RAM real y utilizable.
(Otras peculiaridades x86 y áreas de memoria reservadas probablemente explican el resto, no sé los detalles allí).
MemTotal
en /proc/meminfo
indica RAM disponible para su uso. Justo al final de la secuencia de inicio, el kernel libera init
datos que ya no necesita, por lo que el valor informado /proc/meminfo
podría ser un poco más alto de lo que imprime el kernel durante las partes iniciales de la secuencia de inicio.
(se meminfo
usa indirectamente totalram_pages
para esa pantalla. Para x86_64, esto también se calcula a arch/x86/mm/init_64.c
través de lo free_all_bootmem()
que se encuentra en mm/bootmem.c
los núcleos que no son NUMA).