这里ATC存的是经过IOMMU翻译的GPA->HAP映射项,还是经过SMMU翻译的GPA->HAP映射项?
1. 核心概念与分工
- IOMMU(CPU端):在x86虚拟化环境中,IOMMU(如Intel VT-d)的核心作用是将虚拟机物理地址(GPA)转换为主机物理地址(HPA,即你提到的HAP)。这是虚拟机和主机之间地址隔离与转换的关键硬件单元。
- SMMU(显卡端):SMMU是显卡内部的内存管理单元,它负责的是GPU虚拟地址(GVA)到GPA的转换,或者设备IOVA到GPA的转换,属于显卡内部的地址翻译。
- ATC(Address Translation Cache):这是PCIe设备(如显卡)内部的缓存,用于存储地址转换结果,以减少对IOMMU的重复查询,提升性能。
2. 地址转换流程
当显卡的VDMA发起DMA请求时,它使用的地址是GPA(虚拟机物理地址)。这个GPA需要通过PCIe接口发送到CPU端的IOMMU,由IOMMU完成GPA → HPA的转换。
根据PCIe的ATS(Address Translation Services)机制:
- 如果ATC中没有对应的映射项,显卡会向CPU端的IOMMU发送地址转换请求。
- IOMMU完成转换后,将GPA→HPA的映射结果返回给显卡。
- 显卡收到结果后,会将这个映射项缓存到ATC中,后续相同地址的DMA请求就可以直接从ATC获取HPA,无需再请求IOMMU。
3. 结论
因此,图中的ATC存储的是经过IOMMU翻译的**GPA→HAP(HPA)**映射项。