为什么 Linux 显示的内存比我实际安装的内存多或少?

为什么 Linux 显示的内存比我实际安装的内存多或少?

我知道交换 - 这个问题与此无关。在 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-e820indmesg来“查看”这些漏洞。内存映射显示在那里(dmesg启动后位于输出的顶部)。您应该能够看到哪些物理地址拥有真正可用的 RAM。
(其他 x86 怪癖和保留内存区域可能占其余部分 - 我不知道那里的详细信息。)

MemTotalin/proc/meminfo表示 RAM 可供使用。在引导序列结束时,内核释放init不再需要的数据,因此报告的值/proc/meminfo可能比内核在引导序列的初始部分打印出的值稍高。

meminfo间接totalram_pages用于该显示。对于 x86_64,这arch/x86/mm/init_64.c也是通过free_all_bootmem()其本身用于mm/bootmem.c非 NUMA 内核计算的。)

相关内容