内存初始化主要在start_kernel函数中,主要内容有:
1. 从dts中扫描所有物理内存和预留内存,并添加到memblock子系统
2. 给memblock中的所有非预留memory region建立页表映射
3. sparse内存模型初始化
4. 计算每个zone管理内存的大小以及每个zone的free list初始化
5. 释放所有空闲内存块到伙伴系统
6.初始化slab和vmalloc子系统
7.初始化kasan,memleak等各种内存检测模块
1.1 内存扫描
系统支持的内存,是怎么告诉内核的?在伙伴系统和slab没有初始化时,内存分配是怎么进行的?
系统支持的可用内存,一般都在DTS中声明,包含起始物理地址(base),和大小(size),在系统启动时,解析DTS并添加到memblock子系统. memblock子系统,是Linux启动阶段的内存分配接口.
函数调用关系:
start_kernel->setup_arch->setup_machine_fdt->early_init_dt_scan->early_init_dt_scan_nodes->early_init_dt_scan_memory
->early_init_dt_add_memory_arch->memblock_add
预留内存: 一些特殊用途,如记录reset reason,modem子系统的共享内存等,这些内存不会被伙伴系统或者slab系统管理.对用户是不可见的.CMA机制也会预留内存,但最终会被伙伴系统管理.需要专用的cma内存分配接口