1 物理内存初始化——引导分配器memblock
Linux内核启动时,先要初始化物理内存,这个阶段的作用主要是确定物理内存大小,哪些是可用的?哪些是预留的?完成这一阶段工作的是memblock引导分配器。
内核启动时初始化物理内存的处理函数调用路径大概是(基于Linux 5.10.1源码查看):
start_kernel(void)
-->setup_arch(&command_line)
-->setup_machine_fdt
-->early_init_dt_scan_nodes
-->of_scan_flat_dt
-->early_init_dt_scan_memory
上文中early_init_dt_scan_memory会读取dts中的memory节点,然后调用early_init_dt_add_memory_arch-->memblock_add-->memblock_add_range在memblock数据结构中添加物理内存。这里我们仔细看下memblock的数据结构(memblock.h文件中):
从以上三个结构体我们不难看出,memblock结构体保护成员struct memblock_type memory成员和struct memblock_type reserved成员,memory就是可以的内存区域,而reserved就是预留的内存区域。struct memblock_type中又有指针指向memblock_region,memblock_region则记录了每个内存分区。
我们接下来仔细看下代码memblock_add和memblock_reserve(在mm/memblock.c中),
1.1 memblcok中memory和reserved的差别
先休息,明天继续~
参考链接:Linux内存管理 (1)物理内存初始化 - ArnoldLu - 博客园 (cnblogs.com)