您应将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怪癖和保留的内存区域可能占了其余部分-我不知道那里的详细信息。)
MemTotal
in /proc/meminfo
表示可使用的RAM。就在引导序列结束时,内核释放init
了不再需要的数据,因此报告的值/proc/meminfo
可能比内核在引导序列的初始阶段打印出的值高一点。
(对于该显示meminfo
间接使用totalram_pages
。对于x86_64,这arch/x86/mm/init_64.c
也通过非NUMA内核free_all_bootmem()
本身的计算得出mm/bootmem.c
。)