基于 Linux 5.4 vs 5.10+ 内核版本对比分析
【本文档包含:重构背景、结构体对比、字段详解、函数迁移、驱动适配、版本差异等完整分析】
一、概述
**核心结论:**struct ttm_resource 于 Linux 5.10 内核引入,用于替换 struct ttm_mem_reg,同时 ttm_mem_type_manager 重命名为 ttm_resource_manager。
1.1 关键信息速查
|------------|------------------------------|
| 被替换结构体 | struct ttm_mem_reg |
| 新结构体 | struct ttm_resource |
| 引入内核版本 | Linux 5.10 (2020年底) |
| 主要作者 | Christian König, Dave Airlie |
| 重构范围 | TTM 内存管理子系统核心层 |
1.2 重构动机与背景
- **命名不清晰:**ttm_mem_reg 中的 "reg" 含义模糊(register/registration),实际表示的是内存资源描述,而非寄存器
- **LRU 管理分散:**LRU 链表节点分散在 ttm_buffer_object 和 ttm_mem_reg 中,管理复杂,不利于统一回收策略
- **类型不安全:**mm_node 为 void* 指针,驱动需要强制类型转换,缺乏类型检查
- **耦合度过高:**内存管理器与 ttm_bo_device 耦合紧密,不利于独立资源生命周期管理
- **接口不统一:**分配/释放函数命名混乱,缺乏统一的 resource 抽象层
1.3 重构时间线
2020年8月 --- Christian König 在邮件列表提议重构,建议重命名 ttm_mem_reg → ttm_resource,ttm_mem_type_manager → ttm_resource_manager
2020年9月 --- Dave Airlie 响应并提交补丁系列,包含3个重命名补丁
2020年10月 --- 补丁合并进入 drm-misc-next 分支
2020年12月 --- Linux 5.10 正式发布,包含新的 ttm_resource 结构体
二、结构体详细对比
2.1 Linux 5.4 内核:struct ttm_mem_reg
struct ttm_mem_reg {
/* 内存管理节点指针(类型不安全) */
void *mm_node;
/* 起始页帧号 */
unsigned long start;
/* 内存区域大小(字节) */
size_t size;
/* 页数 */
size_t num_pages;
/* 内存类型:TTM_PL_SYSTEM/TT/VRAM */
uint32_t mem_type;
/* 放置标志(缓存属性等) */
uint32_t placement;
/* CPU 可访问的总线地址信息 */
struct ttm_bus_placement bus;
};
- 字段说明:
|-----------|--------------------------|-------------------------------------|
| 字段名 | 类型 | 说明 |
| mm_node | void * | 指向 drm_mm_node 或驱动私有节点,void* 类型不安全 |
| start | unsigned long | 起始物理页帧号,或显存偏移页帧号 |
| size | size_t | 内存区域总大小(字节) |
| num_pages | size_t | 包含的页数 = size / PAGE_SIZE |
| mem_type | uint32_t | 内存域类型:0=SYSTEM, 1=TT, 2=VRAM |
| placement | uint32_t | 放置标志:WC/UC/CACHED 等缓存属性 |
| bus | struct ttm_bus_placement | 总线地址、IO映射等 CPU 访问信息 |
2.2 Linux 5.10+ 内核:struct ttm_resource
struct ttm_resource {
/* 起始页帧号(继承) */
unsigned long start;
/* 内存区域大小(继承) */
size_t size;
/* 内存类型(继承) */
uint32_t mem_type;
/* 放置标志(继承) */
uint32_t placement;
/* 总线地址信息(继承) */
struct ttm_bus_placement bus;
/* 【新增】反向指针:指向所属 BO */
struct ttm_buffer_object *bo;
/* 【新增】LRU 链表节点 */
struct ttm_lru_item lru;
};
- 字段变化说明:
|-----------|-----------------------------|------|-------------------------|
| 字段名 | 类型 | 来源 | 说明 |
| start | unsigned long | 继承 | 起始物理页帧号 |
| size | size_t | 继承 | 内存区域总大小 |
| mem_type | uint32_t | 继承 | 内存域类型 |
| placement | uint32_t | 继承 | 放置标志 |
| bus | struct ttm_bus_placement | 继承 | 总线地址信息 |
| bo | struct ttm_buffer_object * | 【新增】 | 反向指针,从 resource 找到所属 BO |
| lru | struct ttm_lru_item | 【新增】 | LRU 管理节点,替代 BO 中的 lru |
2.3 核心差异总结
|---------|-----------------------|----------------------|
| 对比项 | ttm_mem_reg (5.4) | ttm_resource (5.10+) |
| 命名 | mem_reg(含义模糊) | resource(清晰表示资源) |
| mm_node | void * 类型不安全 | 移除,功能拆分为 bo + lru |
| LRU 位置 | 在 ttm_buffer_object 中 | 在 ttm_resource 中 |
| BO 关联 | 通过 mm_node 间接查找 | 通过 bo 反向指针直接访问 |
| 分配方式 | 嵌入在 BO 中(结构体) | 动态分配(指针) |
| 生命周期 | 与 BO 绑定 | 可独立管理,支持池化 |