目录
一、概念解释
IOVA(IO Virtual Address,输入/输出虚拟地址)
IOMMU(I/O Memory Management Unit):IOMMU是一种硬件单元,用于管理设备对内存的访问。它可以将IOVA地址转换为物理地址,从而保证设备访问的安全和正确性。没有开启IOMMU的情况下,CPU使用的是虚拟地址,设备访问内存使用的是物理地址。如果系统开启IOMMU,CPU使用基于MMU映射的VA,设备也可以使用基于IOMMU映射的IOVA。
SMMU(System MMU,系统内存管理单元),同上,别名。
DMA(Direct Memory Access):DMA允许设备绕过CPU,直接与内存进行数据传输。这可以提高数据传输效率,但需要合理管理IOVA地址,以确保设备访问正确的内存区域。
二、深入浅出
所谓iova可以理解为io的地址,或者说是DMA的地址。很多之前的phys_addr关键字都被替换为了iova关键字了。因为在之前dpdk不感知iommu,设置DMA都是用物理地址,但是在借助iommu时就可以使用虚拟地址进行DMA了。
iova有两种模式,一种是RTE_IOVA_VA,一种是RTE_IOVA_PA,RTE_IOVA_VA表示DMA操作可以使用虚拟地址表示目的地址,而RTE_IOVA_PA则表示DMA必须要用物理地址作为目的地址。
当一个设备(比如ISP)收到来自另一个设备的IOVA地址时,它无法直接使用这个IOVA地址来访问内存。相反,ISP通常会通过IOMMU来进行地址转换。
设备通常使用DMA引擎进行内存传输。DMA引擎会使用IOMMU进行地址转换,确保设备只能访问其被授权的内存区域。
三、应用
不同设备间访问同一地址,比如ap侧分配camera buffer内存给isp侧,isp侧要读写这块儿内存,那么就可以传递iova地址即可,不必传递物理地址。
四、常见问题
为什么isp不直接申请内存?因为isp不具有这种能力,依赖于外部的内存分配。