memblock 作用
内核初始化阶段是用引导内存分配器 memblock 进行管理,因为内核里面有很多内存结构体,不可能在静态编译阶段就静态初始化所有的这些内存结构体。另外,在系统启动过程中,系统启动后的物理内存分配器本身也需要初始化,如伙伴分配器,那么伙伴分配器如何获取内存来初始化自己呢 ?为了达到这个目标,我们先实现一个满足要求的但是可能效率不高的笨家伙,引导内存分配器。用它来负责系统初始化初期的内存管理, 最重要的, 用它来初始化我们内存的数据结构, 直到我们真正的内存管理器被初始化完成并能投入使用, 我们将旧的内存管理器丢掉。
memblock 获取物理内存信息
设备启动时,引导程序把设备树二进制文件从存储设备读到内存中,引导内核的时候把设备树二进制文件的起始地址传给内核,内核解析设备树二进制文件后得到硬件信息。
memory@80000000 { device_type = "memory"; reg = <0x80000000 0x20000000>; }; reserved-memory { #address-cells = <1>; #size-cells = <1>; ranges; linux,cma { compatible = "shared-dma-pool"; reusable; size = <0xa000000>; linux,cma-default; }; };
上面设备树描述了一个以 0x80000000 为首地址,长度为 0x20000000 的内存,会被添加到 memblock 中,调用关系如下:
start_kernel() ---> setup_arch() ---> setup_machine_fdt() ---> early_init_dt_scan_nodes() ---> early_init_dt_scan_memory() ---> early_init_dt_add_memory_arch() ---> memblock_add()
标签:初始化,memblock,memory,介绍,---,内存,分配器,linux From: https://www.cnblogs.com/god-of-death/p/17501810.html