一、MMU VS IOMMU
Fig1. MMU地址转换框图
Fig2. 同一虚拟机下IOMMU地址转换框图
Fig3. 不同虚拟机下IOMMU地址转换框图
二、某个IO DEVICE如何找到其对应的IOPT并完成地址转换?
设备发起DMA请求时,会将自己的Source Identifier(包含Bus/Device/Func)和当前进程的PASID包含在请求中,IO MMU根据该标识完成映射。过程如下:
Fig4. IOMMU页表查询过程
查询详细过程过程如下:
(1) 用device id号查询DTE表,找到一个DTE表项,内容如下:
(2)通过DTE表项中的GCR3 Table Root Pointer找到GCR3 L1表(最高支持L3级)基地址。
(3) 用PSAID查询(最高L3级查询)GCR3表,找到对应PASID和device ID的GCR3表项。
(4) GCR3表项保存了IOMMU对应于PASID和device ID的页表的基地址,IOMMU用该页表对IOVA进行转换,即可得到IOPA。
三、多进程访问IOMMU
现在大部分IOMMU,都支持多进程访问。比如我有两个进程同时从用户态访问设备,他们自己管理iova,这样,他们给iommu提供的iova就可能是冲突的。所以,IOMMU硬件同时支持多张iopt,用进程的id作为下标(对于PCIE设备来说,就是pasid了),Fig.4展示pasid在GPU和CPU地址空间share的一个应用:
Fig.5 CPU和GPU地址空间共享