我一直在阅读关于Linux中的IOMMU支持的文章,并对IOMMU中的页表提出了一些问题:
我还没有看过任何驱动程序代码,所以如果有人能告诉我一些示例驱动代码,那就太好了。
发布于 2016-06-28 23:42:22
IOMMU是否使用CPU MMU页表来存储VA->PA映射?
不是的。操作系统中有许多进程,每个进程都有自己的VA->PA映射(它们都在单独的虚拟地址空间中运行)。
有物理内存,由内存控制器控制。还有一些设备想要访问物理内存: CPU和外部总线控制器。CPU有自己的转换,总线控制器有自己的。

如果没有,即虚拟地址是不同的,那么每个设备还是每个IOMMU单元都创建了映射?
映射是根据IOMMU的功能创建的。一些简单的IOMMU可能有一个设备总线根控制器()的全局映射。复杂的IOMMU (如Intel的VT)可能有几个映射或嵌套的翻译,它们是根据某些每个端口规则选择的。(但桥接后的两个设备通常具有相同的转换。)
https://www.kernel.org/doc/Documentation/Intel-IOMMU.txt
Intel IOMMU驱动程序为每个域分配一个虚拟地址。每个PCIE设备都有自己的域(因此是保护)。p2p桥下的设备与p2p桥接器下的所有设备共享虚拟地址,原因是p2p桥的事务id别名。
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年)和IOMMU.txt
和http://developer.amd.com/wordpress/media/2012/10/IOMMU-ben-yehuda.pdf论文(2012年)的历史设备内存重映射和IOMMU的使用虚拟化。
发布于 2017-01-09 23:17:25
虽然osgx的回答对内核中的IOMMU的历史使用是正确的,但是共享虚拟内存用例,特别是对于PCIe PASID,将需要共享或隐藏IOMMU和CPU页表,这样指针/VA(例如固定缓冲区)可以直接从用户空间驱动程序传递到设备,而无需任何dma_map相关的内核服务。
当然,这将需要新的API,以便用户空间能够请求支持向量机((AMD%29)/shared页面表)。
https://stackoverflow.com/questions/37525651
复制相似问题