您应将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。这应该可以解释“可用”输出中第二个数字与实际安装的RAM之间的大部分差异。
您可以grep为BIOS-e820在dmesg“看到”这些孔。内存映射显示在此处(dmesg引导后,在输出顶部的右侧)。您应该能够看到您拥有真正可用的RAM的物理地址。
(其他x86怪癖和保留的内存区域可能占了其余部分-我不知道那里的详细信息。)
MemTotalin /proc/meminfo表示可使用的RAM。就在引导序列结束时,内核释放init了不再需要的数据,因此报告的值/proc/meminfo可能比内核在引导序列的初始阶段打印出的值高一点。
(对于该显示meminfo间接使用totalram_pages。对于x86_64,这arch/x86/mm/init_64.c也通过非NUMA内核free_all_bootmem()本身的计算得出mm/bootmem.c。)