MATLAB/Simulink水下机器人控制仿真:从六自由度模型到推力分配
2026/9/16 14:24:59
在 Linux 内核启动的早期阶段,物理内存管理面临着一个“鸡生蛋,蛋生鸡”的问题:内核需要分配内存来初始化用于内存管理的数据结构(如struct page数组),但此时完善的 Buddy 分配器尚未建立。为了解决这个问题,内核引入了简单的引导内存分配器。
在内核启动初期,内存管理子系统尚未初始化完成,主要面临以下挑战:
mem_map(页描述符数组)尚未分配和初始化。struct zone和struct page等结构,在这些结构就绪前无法工作。因此,内核需要一个简单、临时的内存分配机制,这就是引导内存分配器。它仅在启动阶段工作,一旦 Buddy 系统初始化完成,引导内存分配器就会将管理权移交出去并退役。
随着 Linux 内核的发展,引导内存分配器也经历了演变。
bootmem是较早期的引导内存分配器,主要利用一个位图(bitmap)来管理内存。
bootmem,但其他一些处理器架构仍在使用。memblock是目前主流(包括 ARM64)使用的引导内存分配器,用于替代bootmem。
memory:描述系统所有可用的物理内存范围。reserved:描述已经被预留、占用的内存范围。memblock不使用庞大的位图,而是直接管理“内存区域(Region)”的数组。memory列表中查找空闲空间,并将其添加到reserved列表中。memblock_add添加内存,memblock_remove移除内存,memblock_alloc分配内存。引导内存分配器是一个临时的“管家”,它的最终使命是将内存管理权平稳过渡给 Buddy 分配器。这个过程发生在内核初始化函数mm_init()流程中。
收集内存信息:
memblock_add()将物理内存范围注册到引导分配器中。早期分配服务:
memblock_alloc()处理。协助建立 Buddy 结构:
mem_map(存放所有的struct page)。释放空闲内存给 Buddy:
memblock_free_all()或free_all_bootmem()的函数。__free_pages等接口)。free_area链表中,正式成为 Buddy 系统的可分配资源。引导分配器退役:
alloc_pages,kmalloc)进行。| 特性 | 引导内存分配器 (memblock/bootmem) | Buddy 分配器 |
|---|---|---|
| 生命周期 | 仅限于内核启动早期 | 内核初始化完成后一直运行 |
| 管理粒度 | 粗粒度的物理地址范围 | 精细的页框 (Page Frame) |
| 算法复杂度 | 简单(线性扫描/数组管理) | 复杂(阶梯链表、反碎片、LRU等) |
| 主要职责 | 1. 临时响应早期分配请求 2. 协助初始化 Buddy 的元数据 3. 将空闲内存移交给 Buddy | 系统运行时的通用物理内存管理 |
简而言之,引导内存分配器是 Buddy 分配器的前置加载器。它在荒芜的物理内存上建立起最基础的秩序,为构筑宏大的 Buddy 内存帝国铺平道路,并在完成使命后功成身退。