Чому Linux показує більше і менше пам'яті, ніж я фізично встановив?


11

Я знаю про своп - це питання не про це. У dmesg ядро ​​Linux (x86-64) розповідає мені про те, скільки у мене пам'яті:

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

cat /proc/meminfo говорить мені, що маю

MemTotal:        3910472 kB

За моїми підрахунками, я думаю, я повинен мати рівно 4 * 1024 * 1024 = 4194304k оперативної пам’яті. Що набагато менше, ніж другий малюнок у рядку dmesg вище!

Що з усіма цими різними фігурами?

До речі, uname -aрезультати:

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

Відповіді:


20

Ви повинні прочитати dmesgзначення "Пам'ять Akb / Bkb доступно" як:

Зараз A доступний для використання прямо зараз, і найвищий номер кадру сторінки, помножений на розмір сторінки, становить B.

Це від 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()повертає обсяг фізичної пам'яті, керований ядром, який наразі не використовується. max_pfn- це найвищий номер кадру сторінки ( PAGE_SHIFTзсув перетворює цей на kb). Найвищий номер кадру сторінки може бути (набагато) більшим, ніж можна було очікувати - відображення пам'яті, зроблене BIOS, може містити отвори.
Скільки займають ці отвори, відслідковується absent_pagesзмінною, відображеною як kB absent. Це повинно пояснити велику різницю між другим номером у "доступному" виході та вашим фактичним встановленою оперативною пам'яттю.

Ви можете виокремити для BIOS-e820в dmesg«бачити» ці отвори. Карта пам'яті відображається там (праворуч у верхній частині dmesgрезультату після завантаження). Ви повинні мати можливість бачити, за якими фізичними адресами ви маєте реальну корисну пам'ять.
(Інші примхи x86 та зарезервовані області пам'яті, ймовірно, припадають на решту - я не знаю деталей там.)

MemTotalв /proc/meminfoвказує оперативну пам'ять, доступну для використання. В кінці послідовності завантаження ядро ​​звільняє initдані, які йому більше не потрібні, тому значення, про яке повідомляється, /proc/meminfoможе бути трохи вище, ніж те, що ядро ​​виводить під час початкових частин завантажувальної послідовності.

( meminfoвикористовує опосередковано totalram_pagesдля цього дисплея. Для x86_64 це обчислюється arch/x86/mm/init_64.cнадто, через free_all_bootmem()що воно є mm/bootmem.cдля ядер, що не є NUMA.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.