Powinieneś przeczytać dmesg
wartości „Pamięć Akb / Bkb dostępna” jako:
Obecnie dostępna jest opcja A, a najwyższa liczba ramek strony w systemie pomnożona przez rozmiar strony to B.
To jest 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()
zwraca ilość pamięci fizycznej zarządzanej przez jądro, która nie jest aktualnie używana. max_pfn
to najwyższy numer ramki strony ( PAGE_SHIFT
shift konwertuje to na kb). Najwyższa liczba ramek strony może być (znacznie) wyższa niż można by się spodziewać - mapowanie pamięci wykonane przez BIOS może zawierać dziury.
Ile zajmują te dziury jest śledzone przez absent_pages
zmienną wyświetlaną jako kB absent
. To powinno wyjaśnić większość różnic między drugą liczbą w „dostępnym” wyjściu a rzeczywistą zainstalowaną pamięcią RAM.
Można grep dla BIOS-e820
w dmesg
„zobaczyć” te otwory. Mapa pamięci jest tam wyświetlana (bezpośrednio u góry dmesg
wyjścia po uruchomieniu). Powinieneś być w stanie zobaczyć pod jakim fizycznym adresem masz rzeczywistą, użyteczną pamięć RAM.
(Inne dziwactwa x86 i zarezerwowane obszary pamięci prawdopodobnie odpowiadają za resztę - nie znam tam szczegółów).
MemTotal
in /proc/meminfo
wskazuje, że pamięć RAM jest dostępna do użycia. Na samym końcu sekwencji rozruchowej jądro uwalnia init
dane, których już nie potrzebuje, więc zgłaszana wartość /proc/meminfo
może być nieco wyższa niż to, co jądro drukuje podczas początkowych części sekwencji rozruchowej.
( meminfo
używa pośrednio totalram_pages
do tego wyświetlania. W przypadku x86_64 jest to również obliczane, arch/x86/mm/init_64.c
za pomocą free_all_bootmem()
którego samo dotyczy mm/bootmem.c
jąder innych niż NUMA).