1. 前言
从本文起,我们聚焦 amdgpu_bo 虚拟地址部分的实现细节。此部分设计依赖若干关键结构体及其交互关系,现将这些核心概念与关联逻辑先行明确:一方面可为后续分析建立认知框架,另一方面也方便读者灵活选择理解方式 —— 既可以在读完后续分析内容后回头深化认知,也能在阅读后文时同步对照此处梳理的信息辅助理解。
先唠一唠这里说的虚拟地址。在这里讨论的“虚拟地址”,指的是 GPU 侧的虚拟地址空间。
-
我们知道,用户态进程中的变量地址属于 CPU 的虚拟地址(Virtual Address),由 CPU 的 MMU(内存管理单元)负责将虚拟地址转换为物理地址,实现进程隔离和内存管理。
-
同样,现代GPU 也有自己的 MMU,用于将 GPU 虚拟地址映射到物理地址,实现显存管理和资源隔离。因此,BO(Buffer Object)中的虚拟地址部分,特指 GPU 的虚拟地址空间,而非 CPU 侧的虚拟地址。
-
在 SVM(Shared Virtual Memory)模式下,CPU 和 GPU 可以共享同一个虚拟地址空间,实现统一的内存访问和更高效的异构计算。
初次接触这些概念时,可能会感到混淆,建议多加理解和对比,以便准确把握两者的区别与联系。
2. 关系示意图
类比进程的虚拟地址中的概念,我们应该有mm、vma。又因为显存管理总是以bo为单位的,要把bo的信息放进去,于是就有了下面三个结构体:amdgpu_bo_va_mapping、amdgpu_bo_va、amdgpu_vm。以下从 “结构关联 - 功能定义 - 简化逻辑” 三层,清晰拆解三者的层级关系与交互机制,为理解 GPU 虚拟地址管理提供核心框架。
3.结构关联
先明确一个应用场景:在多GPU的场景下,一个bo可以被多个GPU访问,例如GTT的bo。那么就需要将这个bo映射到访问它的GPU虚拟地址空间中,因此bo_va是一个链表,链表长度就是已经映射到了几个GPU。
+-------------------+ +-------------------+ +-------------------+
| amdgpu_vm | 1 <-> | amdgpu_bo_va | 1 <-> N | amdgpu_bo_va_mapping|
+-------------------+ +-------------------+ +-------------------+
| ... | | base (vm, bo) | | bo_va |
| va (interval tree)|---------| invalids/valids |---------| start/last/offset |
| ... | | ... | | flags |
+-------------------+ +-------------------+ +-------------------+
4. 核心关系说明(功能视角)
-
amdgpu_vm:GPU 虚拟地址空间 “总管理器”代表一个独立的 GPU 虚拟地址空间,通过 “va 区间树” 统一管理该空间下所有 BO(Buffer Object)的虚拟地址映射,是三者的顶层管理结构。
-
amdgpu_bo_va:BO 与 VM 的 “关联中介”作为单个 BO 在特定 amdgpu_vm 中的 “映射描述体”,一头关联对应的 amdgpu_vm 和 BO,另一头通过
invalids(无效映射)、valids(有效映射)链表,管理该 BO 在 VM 中的多段虚拟地址映射,实现 “1 个 BO 对应 N 段映射” 的灵活管理。 -
amdgpu_bo_va_mapping:虚拟地址映射 “最小单元”具体描述 BO 在 VM 中的某一段虚拟地址映射细节:通过
bo_va指针绑定到所属的 amdgpu_bo_va,再通过 amdgpu_vm 的 “va 区间树” 插入到全局地址管理中,是实现 “地址分配、权限控制、区间查询” 的底层载体。
5.简化逻辑(层级关系)
-
顶层:amdgpu_vm(1 个) → 管理多个 amdgpu_bo_va(1:N)
-
中层:amdgpu_bo_va(1 个) → 包含多个 amdgpu_bo_va_mapping(1:N)
-
底层:amdgpu_bo_va_mapping(1 个) → 描述 1 段具体虚拟地址映射
专文列表:
AMD KFD的BO设计分析系列5-2:VM-amdgpu_vm_bo
AMD KFD中BO的GPU虚拟地址管理
501

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



