[转] bootmem_init分析(Bootm…

来源:互联网 发布:网络导流是什么意思 编辑:程序博客网 时间:2024/05/21 15:26

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~).

 

如下图:

 

 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);  //将所有structpage标志位PG_Reserved,page_flag.h


  ...

 }

 

 

2alloc_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


转自:http://blog.csdn.net/huyugv_830913/article/details/5886879

原创粉丝点击