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


11

我知道交换-这个问题不是。在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

Answers:


20

您应将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-e820dmesg“看到”这些孔。内存映射显示在此处(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。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.