Sé sobre el intercambio, esta pregunta no se trata de eso. En dmesg, el kernel de Linux (x86-64) me dice esto sobre la cantidad de memoria que 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. ¿Cuál es camino más pequeño que la segunda cifra en la línea dmesg de arriba!
¿Qué pasa con todas estas figuras diferentes?
Por cierto, uname -a
salidas:
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
Respuesta aceptada:
Deberías leer el dmesg
valora "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
shift convierte eso 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 huecos.
Las absent_pages
hacen un seguimiento de cuánto ocupan estos huecos. variable, mostrada 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 real instalada.
Puede hacer grep para BIOS-e820
en dmesg
para “ver” estos agujeros. El mapa de memoria se muestra allí (justo en la parte superior de 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 representen el resto; no conozco los detalles allí).
MemTotal
en /proc/meminfo
indica RAM disponible para su uso. Justo al final de la secuencia de arranque, el kernel libera init
datos que ya no necesita, por lo que el valor informado en /proc/meminfo
podría ser un poco más alto que lo que imprime el núcleo durante las partes iniciales de la secuencia de arranque.
(meminfo
usa indirectamente totalram_pages
para esa pantalla. Para x86_64, esto se calcula en arch/x86/mm/init_64.c
también a través de free_all_bootmem()
que a su vez está en mm/bootmem.c
para núcleos no NUMA).