AMD KFD的BO设计分析系列6: BO的物理地址部分-PM

前面文章: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.camdgpu_gtt_mgr.c、ttm_resource.cdrm_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeeplyMind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值