From cb27325e9edb263addf6911b80b4a7578894f09b Mon Sep 17 00:00:00 2001 From: tjytimi Date: Tue, 14 Jun 2022 21:36:15 +0800 Subject: [PATCH] =?UTF-8?q?memblock=20=E5=86=85=E5=AD=98=E5=88=86=E9=85=8D?= =?UTF-8?q?=E5=99=A8=E6=BA=90=E7=A0=81=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本文对应 plan 中 setup_bootmem,内核已不再使用 bootmem 分配器,而改为 memblock 分配器作为初始化时的分配器 Signed-off-by: tjytimi --- articles/20220614-riscv-memblock.md | 479 ++++++++++++++++++++++++++ articles/images/memblock/memblock.png | Bin 0 -> 56634 bytes 2 files changed, 479 insertions(+) create mode 100644 articles/20220614-riscv-memblock.md create mode 100755 articles/images/memblock/memblock.png diff --git a/articles/20220614-riscv-memblock.md b/articles/20220614-riscv-memblock.md new file mode 100644 index 0000000..6a4816e --- /dev/null +++ b/articles/20220614-riscv-memblock.md @@ -0,0 +1,479 @@ +> Author: tjytimi
+> Date: 2022/06/14
+> Revisor: lzufalcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux) + +# memblock 内存分配器原理和代码分析 + +## 前言 + +本文分析 memblock 内存分配器源码,依次对其功能、主要结构体、主要接口函数及内核启动过程中 memblock 主要行为进行分析梳理。内核版本为 Linux 5.17。分析调试时使用 linux-lab 中 ricsv64 虚拟板。 + +## memblock 主要功能 + +memblock 内存页帧分配器是 Linux 启动早期内存管理器,在伙伴系统( Buddy System )接管内存管理之前为系统提供内存分配、预留等功能。 + +memblock 将系统启动时获取的可用内存范围(如从设备树中获取的内存范围)纳入管理,为内核启动阶段内存分配需求提供服务,直到 memblock 分配器将内存管理权移交给伙伴系统。同时 memblock 分配器也维护保留内存( reserved memory ),保证其始终不可用。 + +## memblock 管理结构体 + +内核中定义了一个 `memblock` 实体,作为 memblock 分配器管理载体,其类型为 `struct memblock` 。 + +memblock 分配器管理结构共有三层,从顶向下分别为 `struct memblock` , `struct memblock_type` , `struct memblock_region` ,三层结构关系如下图所示,可结合代码理解。下面将详细分析。 + +![](images/memblock/memblock.png) + +第一层 `struct memblock` 结构体描述分配器整体特性,定义如下: + +``` c +// include/linux/memblock.h : 84 +/** + * struct memblock - memblock allocator metadata + * @bottom_up: is bottom up direction? + * @current_limit: physical address of the current allocation limit + * @memory: usable memory regions + * @reserved: reserved memory regions + */ +struct memblock { + bool bottom_up; /* is bottom up direction? */ + phys_addr_t current_limit; + struct memblock_type memory; + struct memblock_type reserved; +}; + +``` +- `bottom_up` 描述了分配器管理内存是否从底向上,取 `true` 代表从底向上,取 `false` 则反之。 + +- `current_limit` 描述了分配器管理物理内存的最大值。 + +- `memory` 描述了分配器管理的可用内存,此元素为第二层结构 `struct memblock_type` 类型,接下来将进行说明。 + +- `reserved` 描述了分配器管理的不可用内存,包括内核代码段及其他内核不可使用内存。此元素也为第二层结构 `struct memblock_type` 类型。 + +第二层 `struct memblock_type` 结构体用于维护特定内存类型集合,定义如下: + +``` c +// include/linux/memblock.h : 68 +/** + * struct memblock_type - collection of memory regions of certain type + * @cnt: number of regions + * @max: size of the allocated array + * @total_size: size of all regions + * @regions: array of regions + * @name: the memory type symbolic name + */ +struct memblock_type { + unsigned long cnt; + unsigned long max; + phys_addr_t total_size; + struct memblock_region *regions; + char *name; +}; + +``` +- `cnt` 记录了结构体中含有的内存区块数量。 + +- `max` 为结构体中为 regions 数组分配的数量,当需要维护内存区域数目超过 max 后 ,则会倍增 regions 的内存空间。 + +- `total_size` 累计该类型内存集合中包含的物理内存数目。 + +- `regions` 为内存区块数组,描述该集合下管理的所有内存区块,每个数组元素代表一块内存区域,可通过索引可获取对应区块。此元素为第三层结构 `struct memblock_region` 类型,接下来将进行说明。注意区块是按照内存升序或降序排列(由上一层结构中 `bottom_up` 决定),且相邻数组元素所描述内存必不连续(连续会合并为一个数组元素)。 + +- `name` 为内存类型集合名字,如名为 `memory` 代表可用内存集合,`reserved` 代码保留内存集合。 + +第三层 `struct memblock_region` 结构体代表被管理的内存区块,定义如下: + +``` c +// include/linux/memblock.h : 52 +/** + * struct memblock_region - represents a memory region + * @base: base address of the region + * @size: size of the region + * @flags: memory region attributes + * @nid: NUMA node id + */ +struct memblock_region { + phys_addr_t base; + phys_addr_t size; + enum memblock_flags flags; +#ifdef CONFIG_NUMA + int nid; +#endif +}; + +``` +- `base` 区块起始地址。 + +- `size` 区块的大小。 + +- `flags` 区块类型标志,如普通型,热插拔型等。 + +- `nid` 在 NUMA 内存系统中标识节点号。 + +以上介绍了 memblock 的三层结构,其中前两层在源码中已经定义。第三层 region 内存区块则是在内核启动过程中,内核调用相关接口函数动态添加。 + + +## memblock 主要接口函数分析 + +memblock 系统提供相关接口供内核使用,包括内存区块的添加、预留、内存申请等功能。本文将对以下四个关键接口函数进行分析,其余函数可举一反三: + +- `memblock_add` 将内存区块添加到可用内存集合。通过此函数可展示 memblock 添加区块的思路。 + +- `memblock_reserve` 将内存区块添加到保留内存集合。 + +- `for_each_reserved_mem_range` 遍历保留内存区块。通过此函数可展示 memblock 遍历区块的逻辑和思路。 + +- `memblock_phys_alloc` 用于申请 memblock 中的物理内存。可供内核申请内存是 memblock 价值实现的关键。 + +### memblock_add + +`memblock_add` 函数将目标区块添加到可用内存的集合中,函数如下: + +``` c +//mm/memblock.c : 694 +int __init_memblock memblock_add(phys_addr_t base, phys_addr_t size) +{ + phys_addr_t end = base + size - 1; + + memblock_dbg("%s: [%pa-%pa] %pS\n", __func__, + &base, &end, (void *)_RET_IP_); + + return memblock_add_range(&memblock.memory, base, size, MAX_NUMNODES, 0); +} + +``` + +可见其主要调用 `memblock_add_range` 实现, `memblock_add_range` 函数将目标区块添加到第一个参数 `type` 指定的管理集合中, `memblock_add` 调用 `memblock_add_range` 时将第一个参数设置为全局的 `memblock.memory` 。`memblock_add_range` 函数定义如下: + +```c +//mm/memblock.c : 573 +static int __init_memblock memblock_add_range(struct memblock_type *type, + phys_addr_t base, phys_addr_t size, + int nid, enum memblock_flags flags) +{ + bool insert = false; + phys_addr_t obase = base; + phys_addr_t end = base + memblock_cap_size(base, &size); + int idx, nr_new; + struct memblock_region *rgn; + + if (!size) + return 0; + + /* special case for empty array */ + if (type->regions[0].size == 0) { + WARN_ON(type->cnt != 1 || type->total_size); + type->regions[0].base = base; + type->regions[0].size = size; + type->regions[0].flags = flags; + memblock_set_region_node(&type->regions[0], nid); + type->total_size = size; + return 0; + } +repeat: + /* + * The following is executed twice. Once with %false @insert and + * then with %true. The first counts the number of regions needed + * to accommodate the new area. The second actually inserts them. + */ + base = obase; + nr_new = 0; + + for_each_memblock_type(idx, type, rgn) { + phys_addr_t rbase = rgn->base; + phys_addr_t rend = rbase + rgn->size; + + if (rbase >= end) + break; + if (rend <= base) + continue; + /* + * @rgn overlaps. If it separates the lower part of new + * area, insert that portion. + */ + if (rbase > base) { +#ifdef CONFIG_NUMA + WARN_ON(nid != memblock_get_region_node(rgn)); +#endif + WARN_ON(flags != rgn->flags); + nr_new++; + if (insert) + memblock_insert_region(type, idx++, base, + rbase - base, nid, + flags); + } + /* area below @rend is dealt with, forget about it */ + base = min(rend, end); + } + + /* insert the remaining portion */ + if (base < end) { + nr_new++; + if (insert) + memblock_insert_region(type, idx, base, end - base, + nid, flags); + } + + if (!nr_new) + return 0; + + /* + * If this was the first round, resize array and repeat for actual + * insertions; otherwise, merge and return. + */ + if (!insert) { + while (type->cnt + nr_new > type->max) + if (memblock_double_array(type, obase, size) < 0) + return -ENOMEM; + insert = true; + goto repeat; + } else { + memblock_merge_regions(type); + return 0; + } +} + +``` +此函数较长,但逻辑并不复杂,其主要流程为: + +- 当前类型集合为空时,即 `type->regions[0].size == 0` ,直接将区域起始地址,大小等范围填入第一个 `regions` 中,并记录总大小 `total_size` 完成添加,直接返回 0 。否则进入 `reapeat` 标号处代码执行。 + +- 当前类型集合不为空时执行 `repeat` 标号后代码,其中注释说明很详细,将会执行两次,第一次 `insert` 为假,`memblock_insert_region` 函数不会执行,仅对需要插入的区块计数,第二次执行 `memblock_insert_region` 完成实际插入功能。目的是保证数组 `regions` 足够容纳所需插入区块数。 `repeat` 标号后代码主要逻辑如下: + + - 使用 `for_each_memblock_type` 循环,遍历已存在区块,获取存在区块起始地址 `rbase` 和结束地址 `rend` 。 + + - 若新区块在当前遍历区块之前, 即 `rbase >= end` ,则可确定不会重叠,要插入位置为当前区块之前,直接退出循环,将在第二次进行插入流程。 + + - 若新区块在当前遍历区块之后,即 `rend <= base` ,进入下一个循环,继续看后面区块是否与新区块重叠。 + + - 若新区块与当前区块有重叠,且重叠之前有不重叠部分,即 `rbase > base`,则需将新区块前面未和原有区块重叠的那部分插入,并后移新区块起始地址 `base` ,即 `base = min(rend, end) ` 。 + + - 完全遍历已存在区域后,判断新区块尾部是否有超过原有区块部分,即 `base < end` ,若有则这部分也要插入集合。 + + - 插入工作完成后,调用 `memblock_merge_regions` 函数将地址相邻的区块合并为一个区块。该函数遍历所有存在的区块,如相邻则合并。 + +### memblock_reserve + +`memblock_reserve` 函数将目标区块添加到保留内存集合中,函数如下: + +``` c +//mm/memblock.c : 838 +int __init_memblock memblock_reserve(phys_addr_t base, phys_addr_t size) +{ + phys_addr_t end = base + size - 1; + + memblock_dbg("%s: [%pa-%pa] %pS\n", __func__, + &base, &end, (void *)_RET_IP_); + + return memblock_add_range(&memblock.reserved, base, size, MAX_NUMNODES, 0); +} + +``` +可见其和 `memblock_add` 函数类似,均是调用 `memblock_add_range` 实现,不再赘述,区别仅仅在于第一个参数是保留内存区域的集合( `memblock.reserved` )。 + +### for_each_reserved_mem_range + +`for_each_reserved_mem_range` 遍历保留内存区域,通过以下宏可知,其本质上是一个循环,循环中调用 `__next_mem_range` 函数获取区间。 + +``` c +//include/linux/memblock.h : 244 + +#define for_each_reserved_mem_range(i, p_start, p_end) \ +__for_each_mem_range(i, &memblock.reserved, NULL, NUMA_NO_NODE, \ + MEMBLOCK_NONE, p_start, p_end, NULL) + +``` +``` c + +//include/linux/memblock.h : 183 +#define __for_each_mem_range(i, type_a, type_b, nid, flags, \ + p_start, p_end, p_nid) \ + for (i = 0, __next_mem_range(&i, nid, flags, type_a, type_b, \ + p_start, p_end, p_nid); \ + i != (u64)ULLONG_MAX; \ + __next_mem_range(&i, nid, flags, type_a, type_b, \ + p_start, p_end, p_nid)) + +``` +`__next_mem_range` 函数的功能是给出类型为 `type_a` 集合中排除 `type_b` 集合后的可用区间。 + +故此函数在多处遍历时被使用: + +- `for_each_free_mem_range` 函数使用它时,`tpye_a` 取 `memblock.memory` ,`tpye_b` 取 `memblock.reserved` ,遍历可被申请的内存。 + +- `for_each_mem_range` 函数使用它时,`tpye_a` 取 `memblock.memory` ,`tpye_b` 取 `NULL` ,直接遍历 `memblock.memory` 可用内存集合区间。 + +- `for_each_reserved_mem_range` 函数使用它时,`tpye_a` 取 `memblock.reserved` ,`tpye_b` 取 `NULL` ,直接遍历 `memblock.reserved` 保留内存集合区间。 + +### memblock_phys_alloc + +`memblock_phys_alloc` 用于申请 memblock 中的物理内存。其直接调用 `memblock_find_in_range_node` 函数实现功能。`memblock_find_in_range_node` 代码如下: + +``` c +//mm/memblock.c : 1424 + +static phys_addr_t __init_memblock memblock_find_in_range_node(phys_addr_t size, + phys_addr_t align, phys_addr_t start, + phys_addr_t end, int nid, + enum memblock_flags flags) +{ + /* pump up @end */ + if (end == MEMBLOCK_ALLOC_ACCESSIBLE || + end == MEMBLOCK_ALLOC_NOLEAKTRACE) + end = memblock.current_limit; + + /* avoid allocating the first page */ + start = max_t(phys_addr_t, start, PAGE_SIZE); + end = max(start, end); + + if (memblock_bottom_up()) + return __memblock_find_range_bottom_up(start, end, size, align, + nid, flags); + else + return __memblock_find_range_top_down(start, end, size, align, + nid, flags); +} + +``` + +`memblock_find_in_range_node` 函数寻找 memblock 分配器在对应内存节点中符合要求的内存,找到后返回区间物理地址首地址。具体流程如下: + +- 对 `start` 和 `end` 变量进行简单处理,确保由顶向底模式中满足 `start` 小于 `end` ,同时保证不会分配第一个页帧。 + +- 如果 `memblock_bottom_up` 为真, 调用 `__memblock_find_range_bottom_up` 函数搜索大小为 `size` 的合适内存区间。`__memblock_find_range_bottom_up` 函数调用前述 `for_each_free_mem_range` 顺序遍历 memblock 可用内存,发现合适大小区块后返回物理地址。 + +- 反之,调用 ` __memblock_find_range_top_down ` 函数,其逻辑和 `__memblock_find_range_bottom_up` 类似,仅是遍历时方向相反。 + +## memblock 在内核启动过程中的主要行为 + +memblock 在系统启动后提供内存管理功能,这些功能依赖于上节所述接口函数。 + +按照时间顺序,memblock 依次进行可用内存初始化,保留内存初始化,为内核提供内存管理服务,释放和移交管理权等流程。以下将分别进行分析。 + +### memblock 可用内存初始化 + +内核启动后,执行 `start_kernel` 函数,该函数中 `setup_arch` 函数对特定架构进行初始化。在 RISC-V 中该函数中会调用 `parse_dtb` 解析设备树,`parse_dtb` 函数与 `memblock` 相关的分支如下: + +``` +- parse_dtb + - early_init_dt_scan + - early_init_dt_scan_nodes + - early_init_dt_scan_memory + - early_init_dt_add_memory_arch + - memblock_add +``` + +可见最终会调用上节所述 `memblock_add` 函数将可用内存写入 memblock 全局变量中,使可用内存区域受 `memblock` 分配器管理。 + +### memblock 保留内存初始化 + +将需要保留的内存添加进保留内存类型集合( `memblock.reserved` ),使得后续使用 memblock 分配内存时,避开保留内存。例如,在分页系统初始化过程中会调用 `memblock_reserve` 函数将内核程序在内存中的范围保留,保证其不会被覆盖,调用关系如下 + +``` + - paging_init + - setup_bootmem() + - memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start) +``` +类似的,其他保留内存的地方(如设备树中设置的保留内存)也均是通过调用 `memblock_reserve` 接口函数实现。 + +### memblock 的使用 + +当 memblock 系统完成初始化后,需要申请内存时内核会通过 `memblock` 系统。 + +如在 RISC-V 架构下 `setup_vm_final` 函数调用 `create_pgd_mapping` 函数建立页全局目录时,会调用 `alloc_pgd_next` 获取一个页面作为页表。`alloc_pgd_next` 实际是调用 `memblock_phys_alloc` 函数从 memblock 分配器中获取一个空闲页面。 + +### memblock 释放和移交管理权流程 + +当内核完成部分初始化功能,并继续启动到要建立以后内核都将使用内存管理系统时,就到了 memblock 向伙伴系统移交控制权的时候了。`mm_init` 函数负责建立内存管理系统。该函数会调用 `memblock_free_all` 函数,此函数完成 memblock 释放并移交管理权的流程。相关流程如下: + +``` +- mm_init + - mem_init + - memblock_free_all +``` + +` memblock_free_all ` 的代码如下: + +``` c +//mm/memblock.c : 2108 +void __init memblock_free_all(void) +{ + unsigned long pages; + + free_unused_memmap(); + reset_all_zones_managed_pages(); + + pages = free_low_memory_core_early(); + totalram_pages_add(pages); +} +``` + +`memblock_free_all` 中 `free_low_memory_core_early` 函数具体实现释放和移交功能,函数返回空闲页帧数目。`memblock_free_all` 最后调用 `totalram_pages_add` 函数将页帧数目 `pages` 加到全局页面数目 `_totalram_pages ` 变量中。 + +`free_low_memory_core_early` 函数主要流程如下: + +``` +free_low_memory_core_early + - memmap_init_reserved_pages + - __free_memory_core +``` +- `memmap_init_reserved_pages` 函数负责保留内存的移交功能,保证后续伙伴系统也不会使用保留内存。 + +- `__free_memory_core` 函数负责可用内存移交功能,完成最终的管理权限移交。 + + +`memmap_init_reserved_pages` 函数定义如下: + +``` c + +static void __init memmap_init_reserved_pages(void) +{ + struct memblock_region *region; + phys_addr_t start, end; + u64 i; + + /* initialize struct pages for the reserved regions */ + for_each_reserved_mem_range(i, &start, &end) + reserve_bootmem_region(start, end); + + /* and also treat struct pages for the NOMAP regions as PageReserved */ + for_each_mem_region(region) { + if (memblock_is_nomap(region)) { + start = region->base; + end = start + region->size; + reserve_bootmem_region(start, end); + } + } +} + +``` + +函数遍历 memblock 中保留类型集合中所有区块及标志为 `MEMBLOCK_NOMAP` 的可用内存区块,对每个区块调用 `reserve_bootmem_region` 函数。`reserve_bootmem_region` 找到对应区块的页描述符( `struct page` ),使用 `__SetPageReserved(page)` 宏将页面设置为保留,后续伙伴系统将不会分配此页面。 + + +`__free_memory_core` 函数主要流程如下: + +``` +__free_memory_core + - __free_pages_memory + - memblock_free_pages + - __free_pages_core + - __ClearPageReserved + - set_page_count(p, 0) + - __free_pages_ok +``` + +函数最终会调用 `__free_pages_core` 函数,主要完成以下工作: + +- 调用 `__ClearPageReserved` 函数使页帧被内核可用。 + +- 调用 `set_page_count` 将页引用计数器置零。 + +- 调用 `__free_pages_ok` 函数页面添加进伙伴系统。 + +至此, memblock 系统完成其使命,后续页面管理由伙伴系统负责。 + +## 总结 + +本文分析了 memblock 内存分配器主要功能、主要结构体和接口函数及内核启动过程中 memblock 的生命周期。 + diff --git a/articles/images/memblock/memblock.png b/articles/images/memblock/memblock.png new file mode 100755 index 0000000000000000000000000000000000000000..4ab31f0f455079b7a91352daf463556b01908480 GIT binary patch literal 56634 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