news 2026/4/1 15:23:38

linux genpool 学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux genpool 学习

一、背景与引入

在 Linux 内核中,内存管理并不只局限于伙伴系统(buddy allocator)和 slab/slub 分配器。在许多设备驱动、SoC 子系统以及共享内存场景中,开发者往往需要管理一块地址固定、大小有限、分配规则特殊的内存区域,例如:

  • 设备 MMIO / SRAM / TCM

  • 多 OS / 多核共享内存

  • DMA buffer、固件通信缓冲区

  • 预留内存(reserved-memory)

这类内存既不适合直接交给 buddy system,也不适合 slab 管理对象生命周期。为此,Linux 内核提供了一个相对独立、通用而轻量的组件 ——genpool(Generic Memory Pool)

本文将从设计动机、核心数据结构、分配算法以及典型使用场景几个方面,对 Linux genpool 进行系统性介绍。


二、什么是 genpool

genpool(Generic Pool)是 Linux 内核中的一种通用内存池管理机制,用于在一段连续的物理或虚拟地址区间上,按固定最小粒度(granularity)进行动态分配和释放。

其核心目标可以概括为三点:

  1. 管理非伙伴系统的内存区域

  2. 提供确定性强、开销低的分配接口

  3. 适用于驱动和平台代码的早期或特殊内存管理

genpool 的实现位于内核源码:

lib/genalloc.c include/linux/genalloc.h


三、genpool 的典型使用场景

在内核中,genpool 被广泛用于以下场景:

  • SoC驱动:管理片上 SRAM / TCM

  • 设备固件通信:Host–Device 共享内存

  • DMA子系统:特定地址范围的 buffer 分配

  • reserved-memory:设备树中预留内存的管理

  • 多 OS / 多核系统:共享 non-cache memory

这些场景具有一个共同特征:

内存区域的起始地址和大小在系统设计阶段已知,但运行时需要进行灵活分配。

有很多和bitmap相关的算法


四、genpool 的核心设计思想

4.1 固定粒度(granularity)

创建 genpool 时,需要指定一个最小分配粒度(通常是 2 的幂,例如 32B / 64B / 4KB):

struct gen_pool *gen_pool_create(int min_alloc_order, int nid);

  • min_alloc_order:最小分配单位 = 2^order 字节

  • genpool 内部所有管理都基于该粒度

这使得 genpool 在嵌入式和实时场景中具有非常稳定的分配行为。


4.2 基于位图(bitmap)的空间管理

genpool 内部并不维护复杂的红黑树或链表,而是采用:

  • bitmap描述内存块使用情况

  • 每一 bit 对应一个最小粒度单元

这种设计带来的好处包括:

  • 空间开销小

  • 实现简单、易于验证

  • 非常适合硬件资源管理


4.3 chunk 抽象

genpool 并不要求所有内存一次性加入,而是引入了chunk的概念。

每个 chunk 对应一段连续地址空间:

  • start_addr ~ end_addr

  • 配套一份 bitmap

一个 genpool 可以由多个 chunk 组成,这使其在平台初始化阶段具有更高的灵活性。


五、genpool 的分配与释放机制

5.1 添加内存到 genpool

该接口用于将一段内存区域注册到 genpool 中,通常发生在:

  • 平台初始化

  • 驱动 probe 阶段

bits是尾部的变长数组,已经都一起分配并且清零了


5.2 内存分配

分配流程简要概括为:

  1. 将 size 向上对齐到最小粒度

  2. 遍历 pool 中的各个 chunk

  3. 在 bitmap 中查找连续空闲 bit 区间

  4. 标记 bit 为已使用

  5. 返回对应地址

genpool不保证最佳适配(best-fit),而是更偏向简单、快速、可预测的策略。

可以选择最快或者最佳适应的算法

bitmap_set_ll是在读锁下面的操作,竞争,如果没有设置完所有的bit,就清除自己设置的bit,因为流程都是从前到后的顺序设置的,这个开读锁再竞争的操作真的骚


5.3 内存释放

释放时:

  • 根据地址定位 chunk

  • 将对应 bitmap bit 清零

genpool 不维护对象元数据,因此调用者必须保证:

释放地址和大小必须与分配时一致。


六、并发与同步模型

  • genpool本身不强制绑定特定锁模型

  • 内部使用 spinlock 保护关键路径:只有加chunk链表要上spinlock

  • 适用于 IRQ / 原子上下文(部分接口)

这使 genpool 能够安全地被驱动和底层平台代码调用。


七、与其他内存管理机制的对比

机制适用场景特点
buddy system通用物理内存面向页、全局管理
slab/slub内核对象生命周期明确
memblock启动早期只分配不释放
genpool固定地址内存粒度固定、实现简单

genpool 处在一个非常明确的位置:

它不是通用内存分配器,而是资源管理工具。


八、genpool 在系统设计中的价值

从系统架构角度看,genpool 具备以下优势:

  • 将“内存资源管理”从业务逻辑中剥离

  • 适合作为多 OS / 多核共享内存的底层组件

  • 便于进行调试和可视化(bitmap)

  • 实现稳定,长期维护

在复杂 SoC 和异构系统中,genpool 往往是比自研bitmapallocator 更稳妥的选择

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 16:19:20

ScalingLaws-2022-Chinchilla-2:既然Dₒₚₜ/Nₒₚₜ≈20,为什么LLaMA系列用的D/N远大于20【Chinchilla比例:每个参数大约对应20个token】

“每个参数大约对应 20 个 token”(常被叫作 Chinchilla 比例)并不是一条“宇宙定律”。 你看到 LLaMA 系列的 token/参数 比值远大于 20,核心原因是:他们优化的目标、约束条件、以及用来拟合的“最优前沿(frontier)”都变了。 尤其从 Llama 3 开始,论文里甚至明确承认…

作者头像 李华
网站建设 2026/3/24 3:05:44

HTTP Content-Type

HTTP Content-Type 引言 HTTP协议中的Content-Type头字段是Web服务器与客户端之间进行数据交换的重要机制。它定义了服务器发送给客户端数据的类型,允许浏览器或其他客户端应用程序正确地处理和展示这些数据。本文将详细介绍HTTP Content-Type的用途、类型以及在实际应用中的…

作者头像 李华
网站建设 2026/3/27 18:06:57

VSCode 下如何检查 Vue 项目中未使用的依赖?

VSCode 下如何检查 Vue 项目中未使用的依赖? 文章目录 VSCode 下如何检查 Vue 项目中未使用的依赖?1. 使用 depcheck 工具(推荐)安装和使用:配置(可选): 2. 使用 npm-check 工具3. V…

作者头像 李华
网站建设 2026/3/21 13:59:01

SSM计算机毕设之基于ssm的网上手机商城系统基于SSM的手机商城(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/3/17 7:00:26

开题报告 雅韵古诗词系统python爬虫

目录 雅韵古诗词系统Python爬虫简介爬虫技术实现要点数据处理与存储反爬策略应对应用场景扩展 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 雅韵古诗词系统Python爬虫简介 雅韵古诗词系统是一个基于Py…

作者头像 李华
网站建设 2026/3/28 10:07:22

SSM计算机毕设之基于SSM的疫情健康上报管理系统行程上报、健康上报(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华