内存去哪儿了推荐

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

[root@AC1 ~]# free -m total used free shared buffers cachedMem: 3419 3101 318 0 62 1930-/+ buffers/cache: 1109 2310Swap: 0 0 0

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

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

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

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

[ 0.000000] BIOS-provided physical RAM map:[ 0.000000] BIOS-e820: 0000000000000000 - 000000000009bc00 (usable)[ 0.000000] BIOS-e820: 000000000009bc00 - 00000000000a0000 (reserved)[ 0.000000] BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)[ 0.000000] BIOS-e820: 0000000000100000 - 00000000dffc0000 (usable)[ 0.000000] BIOS-e820: 00000000dffc0000 - 00000000dffce000 (ACPI data)[ 0.000000] BIOS-e820: 00000000dffce000 - 00000000dffe0000 (ACPI NVS)[ 0.000000] BIOS-e820: 00000000dffe0000 - 00000000e0000000 (reserved)[ 0.000000] BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)[ 0.000000] BIOS-e820: 00000000ffb00000 - 0000000100000000 (reserved)[ 0.000000] BIOS-e820: 0000000100000000 - 0000000120000000 (usable)[ 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)。 至此是不是有所发现了?

看上面第11行:0000000100000000 – 0000000120000000 这段地址超过了32位系统能访问的范围。算算0x20000000=512M,加到free -m看到的3419M就等于……(还是用一下计算器:等于3931M)貌似与4G还是差的有点多哦。

呵呵,其实应该把512M加上3582M才对,这个3582M怎么来的?不知道的请复习本文前面内容。这下加起来结果就是4094M,与4096M(4G)就基本一样了哦。现在就知道原因了:BIOS可能会把部分系统内存映射到32bit OS不能访问的位置(有些厂商的BIOS会可能让OS访问不到更多的内存)。

提供解决办法两枚:

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

2. 使用64bit系统。

闹里有钱,静处安身。

内存去哪儿了推荐

相关文章:

你感兴趣的文章:

标签云: