Linux IOMMU页表

use*_*335 5 linux-kernel iommu

我一直在阅读Linux中的IOMMU支持,并对IOMMU中的页表有一些疑问:

  1. IOMMU是否使用CPU MMU页表来存储VA-> PA映射?
  2. 如果不是,即虚拟地址不同,那么每个设备或每个IOMMU单元创建的映射是什么?

我还没有查看任何驱动程序代码,所以如果有人能指出我的一些示例驱动程序代码将会很棒.

提前致谢.

osg*_*sgx 6

IOMMU是否使用CPU MMU页表来存储VA-> PA映射?

不是.操作系统中有许多进程,每个进程都有自己的VA-> PA映射(它们都在不同的虚拟地址空间中运行).

有物理内存,由内存控制器控制.还有一些设备需要访问物理内存:CPU和外部总线控制器.CPU有自己的翻译和总线控制器有自己的.

DTR和Intgr的mmu和iommu.svg的wiki图像;  公共区域

如果不是,即虚拟地址不同,那么每个设备或每个IOMMU单元创建的映射是什么?

映射是根据IOMMU的功能创建的.一些简单的IOMMU可能具有一个用于设备总线根控制器的全局映射(PCI-express根comples).像英特尔VT-d这样复杂的IOMMU可能有几个映射或嵌套转换,根据一些每个端口规则选择.(但桥后面的两个设备通常会有相同的翻译.)

https://www.kernel.org/doc/Documentation/Intel-IOMMU.txt

Intel IOMMU驱动程序为每个域分配一个虚拟地址.每个PCIE设备都有自己的域(因此保护).由于p2p网桥的事务id别名,p2p网桥下的设备与p2p网桥下的所有设备共享虚拟地址.

https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt

在某些系统中,总线地址与CPU物理地址相同,但通常它们不是.IOMMU和主桥可以在物理地址和总线地址之间产生任意映射.

(另请参阅https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt中的"这是一张图片和一些例子:"附近的图片)

虚拟地址(X)...虚拟内存系统将X映射到系统RAM中的物理地址(Y).驱动程序可以使用虚拟地址X来访问缓冲区,但设备本身不能,因为DMA不通过CPU虚拟内存系统.

在一些简单的系统中,设备可以直接对物理地址Y进行DMA.但在许多其他系统中,有IOMMU硬件将DMA地址转换为物理地址,例如,它将Z转换为Y.

请参阅https://events.linuxfoundation.org/sites/events/files/slides/20140429-dma.pdf(2014)和http://www.linuxplumbersconf.org/2014/wp-content/uploads/2014/10 /LPC2014_IOMMU.txt

http://developer.amd.com/wordpress/media/2012/10/IOMMU-ben-yehuda.pdf为设备内存重映射和使用IOMMU虚拟化的历史文件(2012年).