¿Por qué Linux muestra más y menos memoria de la que he instalado físicamente?

11

Sé sobre el intercambio, esta pregunta no se trata de eso. En dmesg, el kernel de Linux (x86-64) me dice esto sobre cuánta memoria tengo:

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

cat /proc/meminfo me dice que tengo

MemTotal:        3910472 kB

Y según mis cálculos, creo que debería tener exactamente 4 * 1024 * 1024 = 4194304k RAM. ¡Qué es mucho más pequeño que la segunda figura en la línea dmesg de arriba!

¿Qué pasa con todas estas figuras diferentes?

Por cierto, uname -asalidas:

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
Robin Green
fuente

Respuestas:

20

Debe leer los dmesgvalores "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_pfnes el número de marco de página más alto (el PAGE_SHIFTcambio 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_pagesvariable 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-e820en dmesg"ver" estos agujeros. El mapa de memoria se muestra allí (justo en la parte superior de la dmesgsalida 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í).

MemTotalen /proc/meminfoindica RAM disponible para su uso. Justo al final de la secuencia de inicio, el kernel libera initdatos que ya no necesita, por lo que el valor informado /proc/meminfopodría ser un poco más alto de lo que imprime el kernel durante las partes iniciales de la secuencia de inicio.

(se meminfousa indirectamente totalram_pagespara esa pantalla. Para x86_64, esto también se calcula a arch/x86/mm/init_64.ctravés de lo free_all_bootmem()que se encuentra en mm/bootmem.clos núcleos que no son NUMA).

Estera
fuente