Вы должны прочитать 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
сдвиг преобразует его в КБ). Максимальный номер кадра страницы может быть (намного) больше, чем вы могли ожидать - отображение памяти, выполненное BIOS, может содержать дыры.
Сколько занимают эти дыры, отслеживается absent_pages
переменной, отображаемой как kB absent
. Это должно объяснить большую часть разницы между вторым числом в «доступном» выводе и вашей фактической установленной оперативной памятью.
Вы можете вычленить для BIOS-e820
в dmesg
«видеть» эти отверстия. Там отображается карта памяти (справа вверху dmesg
после загрузки). Вы должны видеть, по каким физическим адресам у вас есть реальная, полезная оперативная память.
(Остальные причуды x86 и зарезервированные области памяти, вероятно, составляют остальное - я не знаю подробностей там.)
MemTotal
in /proc/meminfo
указывает ОЗУ, доступную для использования. В самом конце последовательности загрузки ядро освобождает init
данные, которые ему больше не нужны, поэтому значение, указанное в отчете, /proc/meminfo
может быть немного выше, чем то, что ядро выводит во время начальных частей последовательности загрузки.
( meminfo
используется косвенно totalram_pages
для этого дисплея. Для x86_64 это arch/x86/mm/init_64.c
тоже рассчитывается, через free_all_bootmem()
которое само используется mm/bootmem.c
для ядер, отличных от NUMA.)