首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux IOMMU页表

Linux IOMMU页表
EN

Stack Overflow用户
提问于 2016-05-30 12:26:05
回答 2查看 6.6K关注 0票数 5

我一直在阅读关于Linux中的IOMMU支持的文章,并对IOMMU中的页表提出了一些问题:

  1. IOMMU是否使用CPU页表来存储VA、→、更高级的PA映射?
  2. 如果没有,即虚拟地址是不同的,那么每个设备还是每个IOMMU单元都创建了映射?

我还没有看过任何驱动程序代码,所以如果有人能告诉我一些示例驱动代码,那就太好了。

EN

回答 2

Stack Overflow用户

发布于 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的使用虚拟化。

票数 6
EN

Stack Overflow用户

发布于 2017-01-09 23:17:25

虽然osgx的回答对内核中的IOMMU的历史使用是正确的,但是共享虚拟内存用例,特别是对于PCIe PASID,将需要共享或隐藏IOMMU和CPU页表,这样指针/VA(例如固定缓冲区)可以直接从用户空间驱动程序传递到设备,而无需任何dma_map相关的内核服务。

当然,这将需要新的API,以便用户空间能够请求支持向量机((AMD%29)/shared页面表)。

请参阅https://archive.fosdem.org/2016/schedule/event/intel_svm/attachments/slides/1269/export/events/attachments/intel_svm/slides/1269/FOSDEM_2016___SVM_on_Intel_Graphics.pdf

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37525651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档