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

相关推荐
ltl4 小时前
QUIC 握手实现:Initial 到 1-RTT 的最小路径
linux
Android系统攻城狮6 小时前
Linux PipeWire深度解析之pw_init调用流程与实战(八十三)
linux·运维·服务器·音频进阶·pipewire音频进阶
M78佐菲6 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
zbyyd7 小时前
Linux 进程管理详解:从概念到实战
linux·运维·服务器
薛定猫AI8 小时前
OpenAI Codex本地完整配置教程|(Windows/Mac/Linux全平台,修复鉴权报错)
linux·windows·macos
躺不平的理查德10 小时前
OpenSSL 的异步 TLS 1.3 加密
linux·运维·服务器
tedcloud12310 小时前
Awesome DSH Plugin 怎么用?给 DeepSeek Harness 搭建自己的插件生态
大数据·linux·服务器·人工智能·音视频
钓鱼的小小猫10 小时前
从零拿捏Linux(一) ---- 命令(视频秒解)
linux·linux命令
明王明王10 小时前
Ubuntu 26.04 使用 Windows Spotlight:给 Bing Wallpaper 加上 Spotlight 支持
linux·windows·ubuntu