前面文章:AMD KFD的BO设计分析系列5: BO的虚拟地址部分-VM分析了amdgpu_bo的虚拟地址部分的实现,本篇是针对 amdgpu_bo 物理地址部分(Physical Memory, PM)实现的技术介绍文档,内容结构与虚拟地址部分保持一致,便于对照理解。
1. 关系示意图
amdgpu_bo 的物理地址管理涉及以下核心结构体及其关系:
+-------------------+ +---------------------------+ +----------------------+
| amdgpu_bo | 1 <-> | ttm_resource | 1 <-> N | 物理分块(block/node)|
+-------------------+ +---------------------------+ +----------------------+
| ... | | mem_type/size/start | | start/size/flags |
| ttm_resource * |---------| ... |---------| ... |
| ... | | | | |
+-------------------+ +---------------------------+ +----------------------+
-
amdgpu_bo:显存对象,代表一块可被 GPU/CPU 访问的内存区域。
-
ttm_resource:TTM 框架下的物理资源描述体,记录 BO 实际分配到的物理内存类型、起始地址、大小等信息。
-
物理分块(block/node):在 VRAM/GTT 等物理域中,BO 的物理空间可能由多个分块组成,每个分块有自己的物理起始地址和大小。
2. 核心关系说明(功能视角)
2.1 amdgpu_bo:物理内存分配的“请求者”
-
作为显存分配的核心对象,amdgpu_bo 负责描述 BO 的高层属性(大小、用途、flags 等),并通过 ttm_resource 指针关联实际分配到的物理内存资源。
-
BO 的分配、迁移、销毁等操作,都会影响其物理地址部分的状态。
2.2 ttm_resource:物理资源的“描述体”
-
由 TTM 框架统一管理,ttm_resource 记录 BO 的物理内存类型(如 VRAM、GTT)、分配的起始地址(start)、大小(size)、分块链表等信息。
-
支持多种物理域和分配策略,适应不同类型 BO 的需求。
-
BO 通过
bo->tbo.resource指针访问其物理资源信息。
2.3 物理分块(block/node):物理地址的“最小单元”
-
在 VRAM 管理器(amdgpu_vram_mgr)或 GTT 管理器中,ttm_resource 可能由多个物理分块组成,每个分块有独立的物理地址和大小。
-
分块信息用于页表填充、DMA 映射、物理地址查询等底层操作。
-
例如,amdgpu_vram_mgr_resource 的 blocks 链表,ttm_range_mgr_node 的 mm_nodes 数组。
3. 简化逻辑(层级关系)
- 顶层:amdgpu_bo(1 个) → 关联一个 ttm_resource(1:1)
- 中层:ttm_resource(1 个) → 包含多个物理分块(1:N)
- 底层:物理分块(1 个) → 描述一段具体物理地址区间
4. 物理地址分配与管理流程
4.1 BO 创建与物理资源分配
-
用户空间或内核请求分配 BO 时,驱动根据 BO 的属性(如 domain、flags)构造 ttm_placement,决定分配到哪个物理域(VRAM/GTT)。
-
TTM 框架通过 ttm_resource_manager 分配物理资源,生成 ttm_resource 结构体,并分配实际物理地址区间。
-
在 VRAM 场景下,amdgpu_vram_mgr_new 调用 drm_buddy_alloc_blocks,分配一个或多个物理分块,并记录到 blocks 链表。
4.2 物理地址查询与映射
-
BO 的物理地址信息通过 ttm_resource 及其分块链表获取。
-
页表填充、DMA 映射等操作时,驱动遍历所有分块,将物理地址填充到页表项或 scatterlist,实现虚拟地址到物理地址的映射。
-
物理地址的粒度通常为页(4K/8K/64K等),分块大小和对齐由分配策略决定。
4.3 迁移与驱逐
-
当显存紧张或 BO 需要迁移时,TTM 支持将 BO 从一个物理域迁移到另一个(如 VRAM → GTT)。
-
迁移过程涉及新资源分配、旧资源释放、页表更新等操作,物理地址区间随之变化。
4.4 物理资源释放
-
BO 销毁时,驱动释放 ttm_resource 及其所有物理分块,归还物理地址空间。
5. 总结
amdgpu_bo 的物理地址部分实现,依托 TTM 框架和分块分配器,完成了显存对象从高层分配请求到底层物理地址管理的全流程。通过 ttm_resource 及分块链表,驱动实现了高效、灵活的物理地址分配、查询、迁移和释放。如需深入理解,可结合 amdgpu_vram_mgr.c、amdgpu_gtt_mgr.c、ttm_resource.c、drm_buddy.c 等源码,研究物理地址分配、分块管理和页表映射的具体实现细节。也可以查阅下面的相关文章。
专文列表:
AMD KFD的BO设计分析系列6-1: VRAM BO的显存分配分析
AMD KFD的BO设计分析系列6-2: GTT BO的显存分配分析
AMD KFD的BO设计分析系列6-3: res_cursor--BO物理内存资源的迭代器
技术交流,欢迎加入社区:GPUers。
753

被折叠的 条评论
为什么被折叠?



