本文将记录个人对于IOMMU寻址方式的理解。

1. 背景

  • 1st level translation
  • 2nd level translation
  • Nested translation
  • Pass-through translation

如果没有太多背景知识的话,对于这四种IOMMU寻址方式,读者可能很难理解。因此,在接下来的内容中,将用MMU、EPT中的寻址方式与IOMMU做类比,便于读者理解。

2. IOMMU寻址方式

Pass-through translation

在host上,传统的DMA不用IOMMU,指定的地址即为HPA。

这个case类比于host刚刚启动,进入实模式时,CPU不用MMU,指定的地址即为HPA。

2nd level translation

将device pass-thru给guest时,guest中的DMA并未使用IOMMU,因此,在guest中,DMA指定的地址即为GPA。此时,Hypervisor需要在IOMMU页表中建立GPA到HPA的映射。

这个case类比于vCPU在non-root中进入实模式时,CPU寻址用的就是GPA,Hypervisor需要在EPT页表中建立GPA到HPA的映射。

1st level translation

在host上的DPDK或者SPDK用户态驱动(基于VFIO框架),DMA中指定的地址是HVA,IOMMU页表中填充的是HVA到HPA的映射。

这个case类比于host上已经开启了paging,CPU寻址用的是HVA,MMU页表中填充的是HVA到HPA的映射。

Nested translation

将device pass-thru给guest时,guest运行了DPDK这样的用户态驱动,此时,在guest中,DMA指定的地址是GVA。此刻,IOMMU寻址用到的就是Nested translation了,1st level translation完成GVA到GPA的映射,2nd level translation完成GPA到HPA的映射。

这个case类比于vCPU在non-root下寻址时,已经开启了paging,此时CPU指定的地址是GVA。CPU寻址用的也是嵌套页表,guest中的页表完成GVA到GPA的映射,EPT页表完成GPA到HPA的映射。

3. 总结

安利下类比思维:通过相似事物之间的对比,可以让我们能够更好地理解新的事物和概念。

假设读者对MMU、EPT页表有着很深的理解,此刻,将它们与IOMMU的页表进行类比,读者就能很快理解IOMMU页表了!抓住关键要点:MMU、EPT页表解决的是CPU侧的寻址,而IOMMU页表解决的是device侧(即DMA)的寻址!


参考资料:

  1. Hardware-Assisted-Mediated-Pass-Through-with-VFIO-Kevin-Tian-Intel