Linux TTM 子系统:ttm_mem_reg → ttm_resource

基于 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 绑定 | 可独立管理,支持池化 |

相关推荐
сокол2 小时前
【网安-Web渗透测试-Linux提权】CVE-2023-22809
linux·服务器·网络安全
一个人旅程~2 小时前
Q4OS-linuxDebian内核版本下载链接
linux·经验分享·电脑
YQ_012 小时前
大幅提速 colcon build —— ccache 缓存 + 并行数控制防爆内存
linux·缓存·机器人·ros2
被java抛弃的网工2 小时前
Linux基础--挣点元子(1)
linux·运维·服务器
小夏子_riotous2 小时前
Docker学习路径——7、Docker搭建MySQL 主从复制
linux·运维·mysql·docker·容器·centos·云计算
IMPYLH2 小时前
Linux 的 sleep 命令
linux·运维·服务器·bash
Elivs.Xiang2 小时前
ubuntu20中安装gitlab
linux·ubuntu·gitlab
快乐的划水a2 小时前
单片机仿Linux驱动开发(二)
linux·驱动开发·单片机
ken22322 小时前
中文文件名:find 与 git ls-files / ls-tree 的区别
linux·搜索引擎