现象:
我们在free看到的完整系统内存大小与实际想分配的内存大小不符,往往是小于在bootargs中设置的大小;
例如:我们的bootargs参数
mem=542528K console=ttyAMA0,115200 clk_ignore_unused root=/dev/ram0 rw rdinit=/linuxrc
total used free shared buffers
Mem: 510288 76472 433816 0 0
-/+ buffers: 76472 433816
Swap: 0 0 0
可以看到mem设置成542528K,但是进入内核后,通过free命令查看内存得到的大小为:510288K
那我们剩下来的内存去哪里了呢?
分析:
通过启动打印可以看出初始化的时候,完整的内存与设置的内存大小一致:
Memory: 492132K/542528K available (8958K kernel code, 474K rwdata, 2104K rodata, 1344K init, 1322K bss, 46300K reserved, 4096K cma-reserved)
可以看到后面的大小和bootargs中传入的参数大小一致;前面的492132K是可使用的大小;
但是又发现一个问题,可使用的大小用总共的542528K减去后面的kernel code 8958K,rwdata 474K, rodata 2104K, 1344K init, bss 1322K, 46300K reserved, cma-reserved 4096K,得到的并不是492132K,而是477930K。在查阅资料之后发现,kernel code, rwdata, rodata, init, bss段都应该在reserved内存内。
# dmesg | grep -nr mem
106:Freeing initrd memory: 12716K
196:Freeing unused kernel memory: 1344K
其次,492132K与内核中free看到的510288K,还有一些差距,我们从dmesg可以看到在启动过程中会有一些内存释放 ,492132K + 12716K + 1344K + 4096(cma)= 510288K