1 bootmem_init分析
文件:arch/arm/mm/mmu.c
paging_init -> bootmem_init
1) 为pgdat = NODE_DATA(node),pgda->bdata->node_bootmem_map分配内存空间,起始地址为_end(即kernel的最后地址)。
注:node_bootmem_map占有的页框数= [( (memsize)>>12 ) / 8 ]>>12
2) 通过位图node_bootmem_map先将所有内存页框标志为“0”,然后将node_bootmem_map占有的内存页框标志为“1”。
reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT,
3) reserve_node_zero(NODE_DATA(node))为Kernel和pgd保持内存空间,相应位图标志为“1”。
4)bootmem_free_node为mem_map保持物理页框(0xC0000000~).
如下图:
2 alloc_bootmem_low_pages分析
alloc_bootmem_low_pages最终调用alloc_bootmem_core。该函数利用node_bootmem_map查询所有物理页框的使用情况:“1”已用,“0”空闲。
-----------------------------
find_block:
sidx = find_next_zero_bit(bdata->node_bootmem_map, midx, sidx);
//发现第一个“0”的位置
sidx = align_idx(bdata, sidx, step);
eidx = sidx + PFN_UP(size);
for (i = sidx; i < eidx; i++)
Author:Woodpecker
转自:http://blog.youkuaiyun.com/huyugv_830913/article/details/5886879