我知道交换 – 这个问题与此无关.在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
解决方法:
你应该读取dmesg值“Memory Akb / Bkb available”:
There is A available for use right now, and the system’s highest page frame number multiplied by the page size is 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.这应解释“可用”输出中的第二个数字与实际安装的RAM之间的大部分差异.
您可以在dmesg中使用BIOS-e820来“看到”这些漏洞.存储器映射显示在那里(启动后在dmesg输出的顶部).您应该能够看到您拥有真实可用RAM的物理地址.
(其他x86怪癖和保留的内存区域可能占其余部分 – 我不知道那里的细节.)
/ proc / meminfo中的MemTotal表示可以使用的RAM.在引导序列结束时,内核释放它不再需要的init数据,因此/ proc / meminfo中报告的值可能比内核在引导序列的初始部分打印出的值高一点.
(meminfo间接使用totalram_pages作为该显示.对于x86_64,这也是通过free_all_bootmem()在arch / x86 / mm / init_64.c中计算的,对于非NUMA内核,它本身在mm / bootmem.c中.)
标签:linux,memory,linux-kernel
来源: https://codeday.me/bug/20190809/1628565.html