Você deve ler os dmesg
valores "Memory Akb / Bkb available" como:
No momento, há A disponível para uso e o número de quadro de página mais alto do sistema multiplicado pelo tamanho da página é B.
Isto é 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á em uso no momento. max_pfn
é o número de quadro de página mais alto (o PAGE_SHIFT
turno o converte em kb). O número de quadro de página mais alto pode ser (muito) maior do que o esperado - o mapeamento de memória feito pelo BIOS pode conter falhas.
Quanto esses furos ocupam é rastreado pela absent_pages
variável, exibida como kB absent
. Isso deve explicar a maior parte da diferença entre o segundo número na saída "disponível" e a RAM instalada real.
Você pode pesquisar por BIOS-e820
em dmesg
"ver" esses buracos. O mapa de memória é exibido lá (logo na parte superior da dmesg
saída após a inicialização). Você deve poder ver em quais endereços físicos você possui RAM real e utilizável.
(Outras peculiaridades do x86 e áreas de memória reservada provavelmente são responsáveis pelo resto - não conheço os detalhes lá.)
MemTotal
in /proc/meminfo
indica RAM disponível para uso. Logo no final da sequência de inicialização, o kernel libera os init
dados que não precisam mais; portanto, o valor relatado /proc/meminfo
pode ser um pouco maior do que o que o kernel imprime durante as partes iniciais da sequência de inicialização.
( meminfo
usa indiretamente totalram_pages
para essa exibição. Para x86_64, isso também é calculado por arch/x86/mm/init_64.c
meio do free_all_bootmem()
qual ele é usado para mm/bootmem.c
kernels que não são da NUMA.)