Linux内存初始化分析

内存初始化主要在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内存分配接口

memblockCMA的分析,可以参考对应的文章.

猜你喜欢

转载自blog.csdn.net/bin_linux96/article/details/83341050