浅谈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)的寻址!
参考资料: