Linux系統(tǒng)內(nèi)存去哪兒了?
- [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
細(xì)心的同學(xué)會發(fā)現(xiàn),為何它只顯示總量為3419MB呢?好像一般情況下沒有這種不上不下的內(nèi)存大小(其實我的內(nèi)存為4GB,32bit系統(tǒng))。那么為什么Linux系統(tǒng)沒能全部識別出來呢?難道從硬件識別過程就出錯了?好吧,我重啟機器進入BIOS看看,memory為4GB,說明BIOS是可以識別出全部內(nèi)存,那就在linux啟動時沒有了識別到全部內(nèi)存了。再看看kernel啟動日志與內(nèi)存相關(guān)的打?。?/p>
- [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)
- ……
小學(xué)老師沒有好好教數(shù)學(xué),所以我只會用計算器計,算了一下2695MB+887MB=3582MB,說明kernel啟動時就只識別到了這么多內(nèi)存。再看,3582MB*1024=3667968KB與22行3669760K很接近,本行3494612K和free命令顯示的total mem接近。所以kernel很老實,按部就班的執(zhí)行這它該做的事,沒有偷偷吃掉內(nèi)存。沒辦法了,只好往前看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中獲取到的系統(tǒng)內(nèi)存映射,乍一看很正常的呀。***一行說我沒有使用PAE選項,但我的內(nèi)存沒有超過4GB所以不需要打開它。但我的系統(tǒng)時32位的,映射時哪里來了那么長的地址呀?數(shù)數(shù)32*4=128位,我**,這BIOS好強悍,也不管我的系統(tǒng)行不行就搞了這么大,幸好前面還是有好多0的。再次靠計算器計算一下:2^32 = 4294967296 = 0x100000000(不用數(shù)了,8個0)。 至此是不是有所發(fā)現(xiàn)了?
看上面第12行:0000000100000000 - 0000000120000000 這段地址超過了32位系統(tǒng)能訪問的范圍。在算算0x20000000=512M,加到free -m看到的3419M就等于……(還是用一下計算器:等于3931M)貌似與4G還是差的有點多。其實應(yīng)該把512M加上3582M才對,這個3582M怎么來的?不知道的請復(fù)習(xí)本文前面內(nèi)容。這下加起來結(jié)果就是4094M,與4096M(4G)就基本一樣了?,F(xiàn)在就知道原因了:BIOS可能會把部分系統(tǒng)內(nèi)存映射到OS不能訪問的位置(有些廠商的BIOS會可惡點,讓OS訪問不到更多的內(nèi)存)。
提供兩種解決辦法:
1. 打開kernel PAE編譯選項,其中PAE選項要選擇64GB;
2. 使用64bit系統(tǒng)。