连续内存分配器
全局流程
start_kernel()
setup_arch()
initmem_init() -> x86_numa_init() -> numa_init()
dma_contiguous_reserve(max_pfn_mapped << PAGE_SHIFT) ... 1 预留
x86_init.paging.pagetable_init() -> paging_init()
sparse_init()
memblock_presents()
memory_present() // 分配mem_section,并标记present
sparse_init_nid()
sparse_init_subsection_map() // 初始化subsection_map
zone_size_init()
free_area_init() // 初始化pgdat
rest_init()
kernel_init()
kernel_init_freeable()
smp_init() // 在这之前只有单线程, memblock分配只能发生在这之前
page_alloc_init_late()
do_basic_setup()
do_initcalls()
cma_init_reserved_areas() ... 2 释放预留
释放
分配
数据结构
预留
命令行解析
预留过程
释放
分配 & 释放
分配
释放
例子 & 测试
挂载debugfs
Last updated