bootmem_init分析(Bootmem Allocator)
2010-09-15 20:54
896 查看
1 bootmem_init分析
文件:arch/arm/mm/mmu.cpaging_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);
/* node_bootmem_map占有的内存页框标志为“1" */
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); //将所有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
相关文章推荐
- bootmem allocator分析
- NanoPC-T2 Uboot启动过程分析 - 2-6 board_init_r() part 2
- 移植u-boot到mini2440--board_init_r 分析
- boot memory allocator——自举内存分配器(五:停用bootmem)
- linux 内存管理之bootmem allocator
- lwip内存分配详解对比 mem_init memp_init 源码分析
- u-boot源码----lowlevel_init.S分析
- Linux中的内存分配和释放之mem_init()函数分析
- bootmem allocator
- 内存管理之bootmem管理之free_all_bootmem
- optee的generic_boot_init_primary 分析
- 三星uboot-1.1.6源码分析——lowlevel_init.S (2)——时钟配置
- [转]&nbsp;bootmem_init分析(Bootm…
- [转]&nbsp;bootmem_init分析(Bootm…
- uclinux2.6(bf561)中的bootmem分析(3):init_bootmem_node
- mips架构linux启动分析(六)(arch_mem_init(node内存)内存初始化)
- bootmem allocator分析
- s5pv210 u-boot的那些事儿之---mem_setup.S的分析
- 内存管理 初始化(四)mem_init bootmem 迁移至伙伴系统
- 启动期间的内存管理之bootmem_init初始化内存管理--Linux内存管理(十二)