共享虚拟内存(Shared Virtual Memory,SVM)的目标是让 CPU 与 GPU 使用同一套虚拟地址访问同一份数据,并在两者之间按需迁移页面。要使这一模型成立,单纯的软件框架(HMM、migrate_vma_*、MMU notifier)并不足够,底层硬件必须提供一组相互配合的能力。本文从 AMDGPU/KFD 的实现出发,分层梳理 SVM 所依赖的硬件特性,并给出各特性在内核代码中的落点。
1. 统一虚拟地址空间
SVM 的第一前提是同一个虚拟地址在 CPU 与 GPU 上指向同一个对象。这要求 GPU 的虚拟地址位宽与 CPU 兼容,并具备进程级地址空间隔离能力。
- 兼容的虚拟地址位宽:x86-64 采用 48 位规范地址(canonical address),GPU 的多级页表必须覆盖相同的地址范围,才能保证指针在两侧语义一致。位宽不匹配会导致同一指针在 GPU 侧无法寻址,SVM 无从谈起。
- 进程地址空间标识(PASID):GPU 必须支持为每个进程分配独立的页表上下文。KFD 在进程绑定阶段为其分配 PASID,并将该进程的页表根挂载到对应的 VMID 上,从而实现多进程地址空间隔离。缺少 PASID 时,GPU 无法区分不同进程的相同虚拟地址。
统一地址空间是 SVM 的地基:它决定了“共享指针”这一编程模型能否成立;后续的缺页、一致性、迁移都建立在这一层之上。