GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿por qué Linux muestra más y menos memoria de la que tengo instalada físicamente?

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.

Relacionado:¿Lista de señales generadas por terminal (por ejemplo, Ctrl-C -> SIGINT)?

(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).


Linux
  1. Linux:¿tiene que iniciar sesión un usuario para ejecutar un proceso y convertirse en su propietario?

  2. Linux:¿qué implica el diseño de la memoria del kernel virtual en Dmesg?

  3. ¿El kernel de Linux tiene una función principal?

  4. ¿Por qué rand() repite números con mucha más frecuencia en Linux que en Mac?

  5. ¿Por qué Linux usa una partición de intercambio en lugar de un archivo?

¿Qué es el comando Grep en Linux? ¿Por qué se usa y cómo funciona?

6 razones por las que Linux no tiene más aplicaciones

¿Qué es una GPU Matrox y por qué el servidor UNIX de mi universidad tiene una?

¿Por qué mi sistema muestra solo 3,2 GiB de RAM cuando definitivamente tengo 4,0 GiB?

¿Por qué los números de llamada del sistema Linux en x86 y x86_64 son diferentes?

¿Por qué top muestra una cantidad diferente de núcleos que cpuinfo?