- 论坛徽章:
- 1
|
本帖最后由 arm-linux-gcc 于 2014-06-25 16:49 编辑
不要用alloc_bootmem,不管是nobootmem.c还是bootmem.c的实现,他们都会去从low mem分配,浪费了宝贵的low mem
建议像6楼那么做,最好尽量使用高地址的内存
如果一定要放在low mem或者只有low mem,要注意避开内核已经resever的内存区域,在MACHINE_START的reserve回调被调用之前,内核对以下区域做了reserve:
1,memblock_reserve(__pa(_stext), _end - _stext); 把从.text段到.bss段结尾这段区域加到memblock.reserved
2,memblock_reserve(__pa(swapper_pg_dir), SWAPPER_PG_DIR_SIZE); 把初始页表所在的区域加到memblock.reserved
3,memblock_reserve(virt_to_phys(initial_boot_params), be32_to_cpu(initial_boot_params->totalsize)); 把dtb所在的区域加到memblock.reserved
上述3个做了之后才轮到MACHINE_START中的reserve
你的10M最好挨着这些区域放,以便使得有尽量多的连续物理内存
另外cmdline中mem=size@address这种保留内存的方法最好不要再用了,在3.x的内核中,/dev/mem的mmap会将这种内存强制搞成uncache的——性能不好
ATAG_MEM和dtb中的memory节点与mem=这种方法是等价的,也不要用他们来保留内存。
使用memblock_reserve才显得更标准一些。
|
|