[转] bootmem_init分析(Bootm…
2013-07-03 17:36
169 查看
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);
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
相关文章推荐
- [转]&nbsp;bootmem_init分析(Bootm…
- Ubuntu&nbsp;init启动流程分析
- linux init
- 全面分析&nbsp;Spring&nbsp;的编程式事务管理…
- 10 个强大的开源 Web 流量分析工具
- Android ANR问题分析[转]
- USB协议深入分析 设备描述符配置包…
- SD 卡驱动程序分析
- Linux 内核分析
- Arm&nbsp;linux启动分析(5)
- 编译原理笔记8 自上而下语法分析-…
- Linux&nbsp;sar分析网卡流量
- Linux基础:&nbsp;解密module_init幕后…
- Get&nbsp;To&nbsp;Know&nbsp;Linux:&nbsp;The&nbsp;/etc/init…
- mips架构linux启动分析(五)(bootmem和blockmem机制的初始化)(prom_init_numa_memory)
- PHP session的详细分析
- yii framework(一)入口分析
- Linux&nbsp;USB驱动框架分析(一)
- USB 协议分析 设置USB地址 和 配置…
- java&nbsp;&nbsp;棋盘覆盖程序&nbsp;算法分析题目