Dlaczego Linux pokazuje zarówno coraz więcej pamięci, jak fizycznie zainstalowałem?

11

Wiem o zamianie - to pytanie nie dotyczy tego. W dmesg jądro Linuksa (x86-64) mówi mi o tym, ile mam pamięci:

[    0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)

cat /proc/meminfo mówi mi, że mam

MemTotal:        3910472 kB

Z moich obliczeń wynika, że ​​powinienem mieć dokładnie 4 * 1024 * 1024 = 4194304k pamięci RAM. Co jest znacznie mniejsze niż druga cyfra w powyższej linii dmesg!

O co chodzi z tymi różnymi postaciami?

Nawiasem mówiąc, uname -awyniki:

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
Robin Green
źródło

Odpowiedzi:

20

Powinieneś przeczytać dmesgwartoś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_pfnto najwyższy numer ramki strony ( PAGE_SHIFTshift 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_pageszmienną 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-e820w dmesg„zobaczyć” te otwory. Mapa pamięci jest tam wyświetlana (bezpośrednio u góry dmesgwyjś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).

MemTotalin /proc/meminfowskazuje, że pamięć RAM jest dostępna do użycia. Na samym końcu sekwencji rozruchowej jądro uwalnia initdane, których już nie potrzebuje, więc zgłaszana wartość /proc/meminfomoże być nieco wyższa niż to, co jądro drukuje podczas początkowych części sekwencji rozruchowej.

( meminfoużywa pośrednio totalram_pagesdo tego wyświetlania. W przypadku x86_64 jest to również obliczane, arch/x86/mm/init_64.cza pomocą free_all_bootmem()którego samo dotyczy mm/bootmem.cjąder innych niż NUMA).

Mata
źródło