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

文章详细介绍了Linux内核在初始化阶段使用的两种内存分配器:bootmem分配器主要在早期内核阶段用于临时内存分配,它通过位图记录分配状态并采用最先适配算法;而memblock分配器在ARM64架构中更为重要,用于管理物理内存和内存类型,提供添加、删除和分配内存的接口。这两种分配器在不同的阶段和场景下协同工作,确保内核对内存的有效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一、bootmem分配器

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

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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)

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

内存块类型的数据结构:
在这里插入图片描述
内存块区域的数据结构:
在这里插入图片描述
memblock、memblock_type和memblock_region三个数据结构之间的关系:
在这里插入图片描述

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

在这里插入图片描述
在源文件“mm/memblock.c”定义全局变量memblock,把成员bottom_up初始化为假,表示从高地址向下分配。
在这里插入图片描述
ARM64内核初始化memblock分配过程:
a.解析设备树二进制文件中的节点/memory,把所有物理内存范围添加到memblock;
b.在函数arm64_memblock_init中初始化memblock。

以下针对arm64_memblock_init内核初始化分配器的执行:
在这里插入图片描述
注:fdt_enforce_memory_region(),解析二进制文件节点,得到可用内存的范围,把超出范围的物理内存从memblock中删除。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、memblock分配器编程接口(mm/memblock.c)
memblock_add:添加新的内存块区域到memblock.memory中;
memblock_remove:删除内存块区域;
memblock_alloc:分配内存;
memblock_free:释放内存。

memblock_add:添加新的内存块区域到memblock.memory中
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

memblock_remove:从可用的物理内存区域中删除一块可用的物理内存
在这里插入图片描述
在这里插入图片描述

memblock_alloc:分配物理内存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
memblock_free:释放物理内存
在这里插入图片描述
在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值