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