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

解决方法:

你应该读取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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值