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