深入解读Linux内存管理系列(2)——内存节点的添加
日期 | 内核版本 | CPU架构 | 作者 |
2019.04.06 | Linux-4.4 | PowerPC | LoneHugo |
系列文章:https://blog.****.net/Vince_/article/details/89055979
1. DTS和Memblock
Linux在Boot阶段采用Memblock内存块节点来管理物理内存,系统启动早期通过对dtb的解析获取到对应的物理内存节点信息,将其加入到Memblock中管理起来。这里需要先了解Linux中的设备树DTS(Device Tree Source),提供了通用的框架来管理Linux中物理设备信息。Memblock节点即可以作为DTS节点来配置,系统启动阶段将配置的内存节点解析出来。
DTS参考:https://blog.****.net/RadianceBlau/article/details/70800076
2. 对Memblock的解析
调用内核of模块early_init_dt_scan_memory进行内存节点扫描并添加memblock
在memblock_add_region函数中用到全局变量memblock,引用其中的memory元素,添加节点到其中
early_init_devtree内容解析
- early_init_dt_verify
- fdt_check_header检查:
- fdt_magic取出fdt->magic字段与FDT_MAGIC对比,此处FDT_MAGIC为0xd00dfeed
- #define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
- fdt_version检查
- initial_boot_params赋值为params并计算校验信息
- fdt_check_header检查:
- early_init_dt_scan_chosen_ppc解析初始化命令行参数
- early_init_dt_scan_root获取root节点的#size-cells和#address-cells
- early_init_dt_scan_memory_ppc解析并添加内存节点
- parse_early_param早期参数解析过程(实际上解析earlycon/console)
- 设置memory_limit为min(memory_limit, first_memblock_size)
- setup_initial_memory_limit设置memblock的大小限制,不超过64M,映射64M
- memblock_reserve建立reserved内存节点类型,保留被kernel, initrd, dt, etc…所使用的内存
- 如果relocatable,即PHYSICAL_START > MEMORY_START,则将初始0x8000(32k)预留给中断向量
- reserve_kdump_trampoline保留KDUMP_RESERVE_LIMIT(64k)大小内存给kdump使用,从0起始
- reserve_crashkernel
- early_reserve_mem初始化参数中的保留内存加入保留内存节点
- memblock_enforce_memory_limit根据limit的大小设定各个memblock的大小上限,将大于限制的block部分删除
- memblock_allow_resize
- __memblock_dump_all打印memblock信息
- move_device_tree移动到与kdump, initrd等不重合的区域
- allocate_pacas分配per processor相关的结构struct_pacas
- early_init_dt_scan_cpus查找cpu信息,进行相应的初始化
- check_cpu_feature_properties
- check_cpu_pa_features
- init_mmu_slb_size
- cur_cpu_spec相关各个字段的初始化,包括cpu_features以及dcache和icache相关的信息