Por que o Linux mostra mais e menos memória do que eu instalei fisicamente?

11

Eu sei sobre swap - essa questão não é sobre isso. No dmesg, o kernel Linux (x86-64) me diz o quanto de memória eu tenho:

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

cat /proc/meminfo diz que eu tenho

MemTotal:        3910472 kB

E pelos meus cálculos, acho que deveria ter exatamente 4 * 1024 * 1024 = 4194304k de RAM. Qual é way menor que a segunda figura na linha dmesg acima!

O que há com todas essas figuras diferentes?

A propósito, uname -a outputs:

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
    
por Robin Green 29.01.2012 / 19:00

1 resposta

20

Você deve ler os valores dmesg "Memória Akb / Bkb disponível" como:

There is A available for use right now, and the system's highest page frame number multiplied by the page size is B.

Isso é 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() retorna a quantidade de memória física, gerenciada pelo kernel, que não está atualmente em uso. max_pfn é o número de quadro de página mais alto (o PAGE_SHIFT shift converte isso para kb). O número de quadro de página mais alto pode ser (muito) maior do que você poderia esperar - o mapeamento de memória feito pelo BIOS pode conter furos. O quanto esses furos ocupam é rastreado pela variável absent_pages , exibida como kB absent . Isso deve explicar a maior parte da diferença entre o segundo número na saída "disponível" e sua RAM atual instalada.

Você pode solicitar que BIOS-e820 em dmesg "veja" esses furos. O mapa de memória é exibido lá (à direita na parte superior de dmesg output após a inicialização). Você deve ser capaz de ver em quais endereços físicos você tem RAM real e utilizável.
(Outras peculiaridades do x86 e áreas de memória reservadas provavelmente respondem pelo resto - não sei os detalhes lá.)

MemTotal in /proc/meminfo indica RAM disponível para uso. Logo no final da seqüência de inicialização, o kernel libera init dados, ele não precisa mais, então o valor relatado em /proc/meminfo pode ser um pouco maior do que o que o kernel imprime durante as partes iniciais da inicialização sequência.

( meminfo usa indiretamente totalram_pages para essa exibição. Para x86_64, isso é calculado em arch/x86/mm/init_64.c também via free_all_bootmem() , que está em mm/bootmem.c para os kernels não-NUMA.)

    
por 29.01.2012 / 19:39