内存管理专题03 引导内存分配器原理

一、bootmem分配器
二、memblock分配器

一、bootmem分配器

内核初始化的过程中需要分配内存,内核提供临时的引导内存分配器,在页分配器和块分配器初始化完成之后,把空闲的物理页交给页分配器管理,丢掉引导内存分配器。

1、bootmem分配器定义的数据结构,内核源码如下:

内存管理专题03 引导内存分配器原理_第1张图片
在这里插入图片描述

2、每个内存节点有一个bootmem_data实例(include/linux/memzone.h)

内存管理专题03 引导内存分配器原理_第2张图片

3、bootmem分配器算法

a.只把低端内存添加到bootmem分配器,低端内存是可以直接映射到内核虚拟地址空间的物理内存;
b.使用一个位图记录哪些物理页被分配,如果物理页被分配,把这个物理页对应的位设置位1;
c.采用最先适配算法,扫描位图,找到第一个足够大的空闲内存块;
d.为了支持分配小于一页的内存块,记录上次分配的内存块的结束位置后面一个字节的偏移和后面一页的索引,下次分配的时候从上次分配的位置后面开始尝试。如果上次分配的最后一个物理页剩余空间足够,可以直接在这个物理页上分配内存。

bootmem分配器对外提供分配内存函数alloc_bootmem,释放内存的函数是free_bootmem。(mm/bootmem.c)

ARM64架构内核已经不使用bootmem分配器,但是其他处理器架构还在使用bootmem分配器。

二、memblock分配器

1、memblock分配器使用的数据结构(include/linux/memblock.h)

内存管理专题03 引导内存分配器原理_第3张图片
memblock分配器数据结构:
内存管理专题03 引导内存分配器原理_第4张图片
物理内存和内存类型的区别:
a.内存类型是物理内存类型的子集,在引导内核时可以使用内核参数“mem=nn[KMG]”,指定可用内存的大小,导致内核不能看见所有的内存;
b.物理内存类型总是包含所有内存范围,内存类型只包含内核参数“mem=”指定的可用内存范围。

内存块类型的数据结构:
在这里插入图片描述
内存块区域的数据结构:
内存管理专题03 引导内存分配器原理_第5张图片
memblock、memblock_type和memblock_region三个数据结构之间的关系:
内存管理专题03 引导内存分配器原理_第6张图片

2、ARM64内核初始化memblock分配器流程(include/linux/memblock.h)

内存管理专题03 引导内存分配器原理_第7张图片
在源文件“mm/memblock.c”定义全局变量memblock,把成员bottom_up初始化为假,表示从高地址向下分配。
内存管理专题03 引导内存分配器原理_第8张图片
ARM64内核初始化memblock分配过程:
a.解析设备树二进制文件中的节点/memory,把所有物理内存范围添加到memblock;
b.在函数arm64_memblock_init中初始化memblock。

以下针对arm64_memblock_init内核初始化分配器的执行:
内存管理专题03 引导内存分配器原理_第9张图片
注:fdt_enforce_memory_region(),解析二进制文件节点,得到可用内存的范围,把超出范围的物理内存从memblock中删除。

内存管理专题03 引导内存分配器原理_第10张图片
内存管理专题03 引导内存分配器原理_第11张图片
内存管理专题03 引导内存分配器原理_第12张图片
内存管理专题03 引导内存分配器原理_第13张图片
3、memblock分配器编程接口(mm/memblock.c)
memblock_add:添加新的内存块区域到memblock.memory中;
memblock_remove:删除内存块区域;
memblock_alloc:分配内存;
memblock_free:释放内存。

memblock_add:添加新的内存块区域到memblock.memory中
内存管理专题03 引导内存分配器原理_第14张图片内存管理专题03 引导内存分配器原理_第15张图片
内存管理专题03 引导内存分配器原理_第16张图片
内存管理专题03 引导内存分配器原理_第17张图片
内存管理专题03 引导内存分配器原理_第18张图片

memblock_remove:从可用的物理内存区域中删除一块可用的物理内存
内存管理专题03 引导内存分配器原理_第19张图片
内存管理专题03 引导内存分配器原理_第20张图片

memblock_alloc:分配物理内存
内存管理专题03 引导内存分配器原理_第21张图片
内存管理专题03 引导内存分配器原理_第22张图片
内存管理专题03 引导内存分配器原理_第23张图片
内存管理专题03 引导内存分配器原理_第24张图片
内存管理专题03 引导内存分配器原理_第25张图片
memblock_free:释放物理内存
内存管理专题03 引导内存分配器原理_第26张图片
内存管理专题03 引导内存分配器原理_第27张图片

总结:memblock内存分配器原理
主要是维护两种内存:
1)系统可用的物理内存,即系统实际含有的物理内存,其值从DTS中进行配置,通过uboot实际探测之后传入到内核。
2)第二种内存是内核预留给操作系统的内存,这部分内存作为特殊功能使用,不能作为共享内存使用。

你可能感兴趣的:(数据结构,linux,arm,c语言)