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