Linux系统内存去哪儿了?

系统 Linux
在Linux下,我们经常使用free命令来查看系统的内存使用情况。细心的同学会发现,它只显示总量为3419MB(实际内存为4GB,32bit系统),为什么Linux系统没能全部识别出来呢?Linux系统内存去哪儿了?

[[111344]]

在Linux下,我们经常使用free命令来查看系统的内存使用情况。

  1. [root@AC1 ~]# free -m 
  2.              total       used       free     shared    buffers     cached 
  3. Mem:          3419       3101        318          0         62       1930 
  4. -/+ buffers/cache:       1109       2310 
  5. Swap:            0          0          0 

细心的同学会发现,为何它只显示总量为3419MB呢?好像一般情况下没有这种不上不下的内存大小(其实我的内存为4GB,32bit系统)。那么为什么Linux系统没能全部识别出来呢?难道从硬件识别过程就出错了?好吧,我重启机器进入BIOS看看,memory为4GB,说明BIOS是可以识别出全部内存,那就在linux启动时没有了识别到全部内存了。再看看kernel启动日志与内存相关的打印:

  1. [root@AC1 ~]# more /var/log/dmesg 
  2. …… 
  3. [    0.000000] 2695MB HIGHMEM available. 
  4. [    0.000000] 887MB LOWMEM available. 
  5. …… 
  6. [    0.000000] Initializing HighMem for node 0 (000377fe:000dffc0) 
  7. [    0.000000] Memory: 3494612k/3669760k available (3678k kernel code, 174680k reserved, 2107k data, 396k init, 2760456k highmem) 
  8. …… 

小学老师没有好好教数学,所以我只会用计算器计,算了一下2695MB+887MB=3582MB,说明kernel启动时就只识别到了这么多内存。再看,3582MB*1024=3667968KB与22行3669760K很接近,本行3494612K和free命令显示的total mem接近。所以kernel很老实,按部就班的执行这它该做的事,没有偷偷吃掉内存。没办法了,只好往前看dmsg。

很快就到了dmesg开始的地方,再也没有更前面的东东了。

  1. [0.000000] BIOS-provided physical RAM map: 
  2. [0.000000]  BIOS-e820: 0000000000000000 - 000000000009bc00 (usable) 
  3. [0.000000]  BIOS-e820: 000000000009bc00 - 00000000000a0000 (reserved) 
  4. [0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved) 
  5. [0.000000]  BIOS-e820: 0000000000100000 - 00000000dffc0000 (usable) 
  6. [0.000000]  BIOS-e820: 00000000dffc0000 - 00000000dffce000 (ACPI data) 
  7. [0.000000]  BIOS-e820: 00000000dffce000 - 00000000dffe0000 (ACPI NVS) 
  8. [0.000000]  BIOS-e820: 00000000dffe0000 - 00000000e0000000 (reserved) 
  9. [0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved) 
  10. [0.000000]  BIOS-e820: 00000000ffb00000 - 0000000100000000 (reserved) 
  11. [0.000000]  BIOS-e820: 0000000100000000 - 0000000120000000 (usable) 
  12. [0.000000] Notice: NX (Execute Disable) protection cannot be enabled: non-PAE kernel! 

这些打印是kernel从BIOS中获取到的系统内存映射,乍一看很正常的呀。***一行说我没有使用PAE选项,但我的内存没有超过4GB所以不需要打开它。但我的系统时32位的,映射时哪里来了那么长的地址呀?数数32*4=128位,我**,这BIOS好强悍,也不管我的系统行不行就搞了这么大,幸好前面还是有好多0的。再次靠计算器计算一下:2^32 = 4294967296 = 0x100000000(不用数了,8个0)。 至此是不是有所发现了?

看上面第12行:0000000100000000 - 0000000120000000 这段地址超过了32位系统能访问的范围。在算算0x20000000=512M,加到free -m看到的3419M就等于……(还是用一下计算器:等于3931M)貌似与4G还是差的有点多。其实应该把512M加上3582M才对,这个3582M怎么来的?不知道的请复习本文前面内容。这下加起来结果就是4094M,与4096M(4G)就基本一样了。现在就知道原因了:BIOS可能会把部分系统内存映射到OS不能访问的位置(有些厂商的BIOS会可恶点,让OS访问不到更多的内存)。

提供两种解决办法:

1. 打开kernel PAE编译选项,其中PAE选项要选择64GB;

2. 使用64bit系统。

责任编辑:黄丹 来源: 51CTO博客
相关推荐

2018-10-29 13:46:02

2019-02-01 08:12:16

果粉苹果库克

2014-02-19 14:33:17

2012-12-21 12:40:15

智慧云手机软件

2017-10-12 10:06:23

Linux内存free命令

2018-12-24 08:48:14

NginxApache Cookie

2014-02-13 16:16:33

云架构云计算

2021-09-09 18:12:22

内存分段式网络

2014-02-13 09:40:20

架构师春节旅游

2022-08-30 15:12:10

架构实践

2015-11-13 09:34:25

流量wifi运营商

2019-08-22 09:30:15

旧iPhone苹果手机

2015-11-10 10:40:56

百度爱奇艺规划

2014-06-09 16:32:55

大数据大数据人才

2017-05-15 15:54:50

MySQL数据库

2017-11-27 09:06:16

程序员大数据多线程爬虫

2021-09-29 09:50:41

Linux内核日志

2021-09-08 05:46:51

Linux内核日志

2015-11-12 17:33:01

去哪儿

2013-11-08 10:19:10

点赞
收藏

51CTO技术栈公众号