Ви повинні прочитати 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.)