bootmem_init

难点

void __init bootmem_init(void)
{
unsigned long min, max;


min = PFN_UP(memblock_start_of_DRAM());
max = PFN_DOWN(memblock_end_of_DRAM());


/*
* Sparsemem tries to allocate bootmem in memory_present(), so must be
* done after the fixed reservations.
*/
arm64_memory_present();


sparse_init();
zone_sizes_init(min, max);


high_memory = __va((max << PAGE_SHIFT) - 1) + 1;
max_pfn = max_low_pfn = max;
}

1.bootmem_init------------------->arm64_memory_present------>memory_present

/* Record a memory area against a node. */
void __init memory_present(int nid, unsigned long start, unsigned long end)
{
unsigned long pfn;


start &= PAGE_SECTION_MASK;
mminit_validate_memmodel_limits(&start, &end);
for (pfn = start; pfn < end; pfn += PAGES_PER_SECTION) {
unsigned long section = pfn_to_section_nr(pfn);
struct mem_section *ms;


sparse_index_init(section, nid);
set_section_nid(section, nid);


ms = __nr_to_section(section);
if (!ms->section_mem_map)
ms->section_mem_map = sparse_encode_early_nid(nid) |
SECTION_MARKED_PRESENT;
}
}

填充

mem_section 结构体数组

使用了memblock 分配内存,大小为4K,来放ms 执行的空间,并将齐放在mem_section 结构体数组中。

难点2:

sparse_init()


难点3

zone_sizes_init------->free_area_init_node------>free_area_init_core

node id 号,一般NUMA 为0,node_start_pfn ,起始的pfn,一般也为0,zones_size

上级函数传进来的数组,在上级函数中分析并赋值的,表示在该node 上各个zone 大小,zholes_size,表示空洞大小

void __paginginit free_area_init_node(int nid, unsigned long *zones_size,
unsigned long node_start_pfn, unsigned long *zholes_size)

填充pgdat 并调用free_area_init_core



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值