您的位置:首页 > 其它

[转] bootmem_init分析(Bootm…

2013-07-03 17:36 169 查看


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,

boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT);

3)
reserve_node_zero(NODE_DATA(node))为Kernel和pgd保持内存空间,相应位图标志为“1”。

4)bootmem_free_node为mem_map保持物理页框(0xC0000000~).

如下图:


bootmem_init分析(Bootmem Allocator)" />

5)
memmap_init_zone初始mem_map

bootmem_init->bootmem_free_node->free_area_init_node

->free_area_init_core->memmap_init->memmap_init_zone

for
(pfn = start_pfn; pfn < end_pfn; pfn++) {

if (context == MEMMAP_EARLY)
{

if
(!early_pfn_valid(pfn))

continue;

if
(!early_pfn_in_nid(pfn, nid))

continue;

}

page =
pfn_to_page(pfn);

set_page_links(page, zone, nid,
pfn);

mminit_verify_page_links(page,
zone, nid, pfn);

init_page_count(page);

reset_page_mapcount(page);

SetPageReserved(page); //将所有struct
page标志位PG_Reserved,page_flag.h

...

}


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++) //查询是否连续空闲,否则退出

if
(test_bit(i, bdata->node_bootmem_map)) {

sidx = align_idx(bdata, i, step);

if (sidx == i)

sidx += step;

goto find_block;

}

Author:Woodpecker Pecker.hu@gmail.com

转自:/article/10566389.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: