1. AMDGPU VRAM管理器架构解析
在AMDGPU驱动中,VRAM管理器扮演着承上启下的关键角色。它位于TTM(Translation Table Manager)内存管理框架和DRM Buddy分配器之间,负责协调两者的工作。这个设计体现了Linux内核内存管理子系统的典型分层思想——上层提供统一接口,下层实现具体算法。
1.1 核心组件构成
VRAM管理器主要由三个功能层组成:
集成层作为TTM框架与Buddy分配器的粘合剂,实现了标准的TTM资源管理器接口。当TTM需要分配VRAM时,会调用amdgpu_vram_mgr_new(),这个函数内部再转调Buddy分配器的API。这种设计使得TTM无需关心底层是使用Buddy还是其他分配算法。
统计层维护着精细的内存使用数据,包括:
- 总VRAM使用量(通过TTM接口统计)
- Visible VRAM使用量(通过atomic64_t原子变量统计)
- 每个分配的详细记录(存储在链表中)
策略层处理各种特殊分配需求,比如:
- 连续内存分配(通过CONTIGUOUS标志实现)
- 指定地址范围分配(通过fpfn/lpfn参数控制)
- 大页内存对齐(默认2MB对齐优化TLB效率)
1.2 数据结构精要
struct amdgpu_vram_mgr是管理器的核心数据结构,几个关键字段值得特别关注:
c复制struct drm_buddy mm; // Buddy分配器实例
这个字段承载了所有VRAM的分配和释放操作。初始化时会将全部VRAM空间交给Buddy管理,后续所有分配都从这里分割。
c复制atomic64_t vis_usage; // Visible VRAM使用量
Visible VRAM是CPU可以直接访问的显存区域(通常256MB左右),需要特殊统计。使用原子变量保证多线程安全。
c复制struct list_head allocated_vres_list; // 资源追踪链表
这个链表记录了所有活跃的VRAM分配,每个节点包含分配大小、进程PID等信息,是内存泄漏排查的关键。
2. Buddy分配器集成实现
2.1 初始化流程详解
VRAM管理器的初
