深入解读Linux内存管理系列(2)——内存节点的添加

日期 内核版本 CPU架构 作者
2019.04.06 Linux-4.4 PowerPC LoneHugo

系列文章:https://blog.csdn.net/Vince_/article/details/89055979

1. DTS和Memblock

Linux在Boot阶段采用Memblock内存块节点来管理物理内存,系统启动早期通过对dtb的解析获取到对应的物理内存节点信息,将其加入到Memblock中管理起来。这里需要先了解Linux中的设备树DTS(Device Tree Source),提供了通用的框架来管理Linux中物理设备信息。Memblock节点即可以作为DTS节点来配置,系统启动阶段将配置的内存节点解析出来。

DTS参考:https://blog.csdn.net/RadianceBlau/article/details/70800076

2. 对Memblock的解析

调用内核of模块early_init_dt_scan_memory进行内存节点扫描并添加memblock

在memblock_add_region函数中用到全局变量memblock,引用其中的memory元素,添加节点到其中

深入解读Linux内存管理系列(2)——内存节点的添加_第1张图片

early_init_devtree内容解析

  1. early_init_dt_verify
    1. fdt_check_header检查:
      1. fdt_magic取出fdt->magic字段与FDT_MAGIC对比,此处FDT_MAGIC为0xd00dfeed
      2. #define FDT_MAGIC        0xd00dfeed        /* 4: version, 4: total size */
      3. fdt_version检查
    2. initial_boot_params赋值为params并计算校验信息
  2. early_init_dt_scan_chosen_ppc解析初始化命令行参数
  3. early_init_dt_scan_root获取root节点的#size-cells和#address-cells
  4. early_init_dt_scan_memory_ppc解析并添加内存节点
  5. parse_early_param早期参数解析过程(实际上解析earlycon/console)
  6. 设置memory_limit为min(memory_limit, first_memblock_size)
  7. setup_initial_memory_limit设置memblock的大小限制,不超过64M,映射64M
  8. memblock_reserve建立reserved内存节点类型,保留被kernel, initrd, dt, etc…所使用的内存
  9. 如果relocatable,即PHYSICAL_START > MEMORY_START,则将初始0x8000(32k)预留给中断向量
  10. reserve_kdump_trampoline保留KDUMP_RESERVE_LIMIT(64k)大小内存给kdump使用,从0起始
  11. reserve_crashkernel
  12. early_reserve_mem初始化参数中的保留内存加入保留内存节点
  13. memblock_enforce_memory_limit根据limit的大小设定各个memblock的大小上限,将大于限制的block部分删除
  14. memblock_allow_resize
  15. __memblock_dump_all打印memblock信息
  16. move_device_tree移动到与kdump, initrd等不重合的区域
  17. allocate_pacas分配per processor相关的结构struct_pacas
  18. early_init_dt_scan_cpus查找cpu信息,进行相应的初始化
    1. check_cpu_feature_properties
    2. check_cpu_pa_features
    3. init_mmu_slb_size
    4. cur_cpu_spec相关各个字段的初始化,包括cpu_features以及dcache和icache相关的信息

你可能感兴趣的:(Linux内存管理)