- [root@AC1 ~]# free -m
- total used free shared buffers cached
- Mem: 3419 3101 318 0 62 1930
- -/+ buffers/cache: 1109 2310
- Swap: 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)。 至此是不是有所发现了?
看上面第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系统。