Vím o swapu – o tom tato otázka není. V dmesg mi linuxové (x86-64) jádro říká toto o tom, kolik paměti mám:
[ 0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)
cat /proc/meminfo říká mi, že mám
MemTotal: 3910472 kB
A podle mých výpočtů si myslím, že bych měl mít přesně 4*1024*1024=4194304k RAM. Což je způsob menší než druhé číslo v řádku dmesg výše!
Co je se všemi těmito různými figurami?
Mimochodem, uname -a výstupy:
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
Přijatá odpověď:
Měli byste si přečíst dmesg hodnoty „Memory Akb/Bkb available“ jako:
Právě teď je k dispozici A a nejvyšší číslo rámce stránky systému vynásobené velikostí stránky je B.
Toto je z 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() vrací množství fyzické paměti spravované jádrem, která se aktuálně nepoužívá. max_pfn je nejvyšší číslo rámce stránky (PAGE_SHIFT shift to převede na kb). Nejvyšší číslo rámce stránky může být (mnohem) vyšší, než byste mohli očekávat – mapování paměti provedené systémem BIOS může obsahovat díry.
Jak moc tyto díry zabírají, sledují absent_pages proměnná, zobrazena jako kB absent . To by mělo vysvětlit většinu rozdílu mezi druhým číslem v „dostupném“ výstupu a vaší skutečnou nainstalovanou RAM.
Můžete sáhnout po BIOS-e820 v dmesg „vidět“ tyto díry. Zde se zobrazí mapa paměti (vpravo v horní části dmesg výstup po spuštění). Měli byste být schopni vidět, na jakých fyzických adresách máte skutečnou, použitelnou RAM.
(Zbytek pravděpodobně tvoří jiné x86 vrtochy a vyhrazené oblasti paměti – tam podrobnosti neznám.)
MemTotal v /proc/meminfo označuje RAM dostupnou k použití. Hned na konci zaváděcí sekvence jádro uvolní init data, která už nepotřebuje, takže hodnota uvedená v /proc/meminfo může být o něco vyšší než to, co jádro vytiskne během počátečních částí zaváděcí sekvence.
(meminfo nepřímo používá totalram_pages pro ten displej. Pro x86_64 se toto vypočítá v arch/x86/mm/init_64.c také pomocí free_all_bootmem() který je sám o sobě v mm/bootmem.c pro jádra jiná než NUMA.)