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