![为什么 Linux 显示的内存比我实际安装的内存多或少?](https://linux22.com/image/20530/%E4%B8%BA%E4%BB%80%E4%B9%88%20Linux%20%E6%98%BE%E7%A4%BA%E7%9A%84%E5%86%85%E5%AD%98%E6%AF%94%E6%88%91%E5%AE%9E%E9%99%85%E5%AE%89%E8%A3%85%E7%9A%84%E5%86%85%E5%AD%98%E5%A4%9A%E6%88%96%E5%B0%91%EF%BC%9F.png)
我知道交换 - 这个问题与此无关。在 dmesg 中,Linux (x86-64) 内核告诉我有关我有多少内存的信息:
[ 0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)
cat /proc/meminfo
告诉我我有
MemTotal: 3910472 kB
根据我的计算,我认为我应该有 4*1024*1024=4194304k RAM。这是方式小于上面 dmesg 行中的第二个数字!
这些不同的数字是怎么回事?
顺便说一句,uname -a
输出:
Linux pavilion 3.2.2-1.fc16.x86_64 #1 SMP Thu Jan 26 03:21:58 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
答案1
您应该将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 for BIOS-e820
indmesg
来“查看”这些漏洞。内存映射显示在那里(dmesg
启动后位于输出的顶部)。您应该能够看到哪些物理地址拥有真正可用的 RAM。
(其他 x86 怪癖和保留内存区域可能占其余部分 - 我不知道那里的详细信息。)
MemTotal
in/proc/meminfo
表示 RAM 可供使用。在引导序列结束时,内核释放init
不再需要的数据,因此报告的值/proc/meminfo
可能比内核在引导序列的初始部分打印出的值稍高。
(meminfo
间接totalram_pages
用于该显示。对于 x86_64,这arch/x86/mm/init_64.c
也是通过free_all_bootmem()
其本身用于mm/bootmem.c
非 NUMA 内核计算的。)