我一直在研究Linux中的IOMMU支持,并对IOMMU中的页面表有一些疑问:
- IOMMU是否使用CPU MMU页面表来存储VA→PA映射?
- 如果不是,即虚拟地址不同,那么这些映射是针对每个设备还是每个IOMMU单元创建的?
IOMMU是否使用CPU MMU页面表来存储VA->PA映射?
不是。操作系统中有许多进程,每个进程都有自己的VA->PA映射(它们都在单独的虚拟地址空间中运行)。
物理内存由内存控制器控制。设备想要访问物理内存:CPU和外部总线控制器。CPU有自己的转换和总线控制器有自己的转换。
如果虚拟地址不同,那么映射是按设备还是按IOMMU单元创建的?https://www.kernel.org/doc/Documentation/Intel-IOMMU.txt
英特尔IOMMU驱动程序为每个域分配虚拟地址。每个PCIE设备都有自己的域(因此受到保护)。由于p2p桥的事务ID别名,位于p2p桥下的所有设备与所有其他设备共享虚拟地址。https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt
在一些系统中,总线地址与CPU物理地址相同,但通常不是这样。IOMMU和主机桥可以在物理地址和总线地址之间产生任意映射。(请参阅https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt中“这里有一张图片和一些示例”的附近的图片。)请查看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(2012年)的文章,了解设备内存重映射和IOMMU在虚拟化中的历史。