我知道 PCI 具有称为 ATS 的功能,可以将虚拟地址转换为物理地址,但我不确定当前 x86 平台是否默认启用它。
如果是,我应该如何在Linux系统中生成虚拟地址和对应的页表?
这就是我现在的猜测。首先,像 pci_map_* 这样的 DMA API 将调用 intel iommu 驱动程序来设置页表并获取 io 虚拟地址。其次,PCI 设备将使用该虚拟 io 地址开始事务,vt-d 将该虚拟 io 地址转换为物理地址。我说得对吗?
我知道 PCI 具有称为 ATS 的功能,可以将虚拟地址转换为物理地址,但我不确定当前 x86 平台是否默认启用它。
如果是,我应该如何在Linux系统中生成虚拟地址和对应的页表?
这就是我现在的猜测。首先,像 pci_map_* 这样的 DMA API 将调用 intel iommu 驱动程序来设置页表并获取 io 虚拟地址。其次,PCI 设备将使用该虚拟 io 地址开始事务,vt-d 将该虚拟 io 地址转换为物理地址。我说得对吗?
目前还没有任何支持 ATS 的 Intel CPU。但是,英特尔 VT-d 规范可从 http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/vt-directed-io-spec.pdf获得。它指定如何启用 ATS 以及如何设置页表。具体参见第 4 章。https://01.org/blogs/ashokraj/2018/recent-enhancements-intel-virtualization-technology-directed-i/o-intel-vt-d也有一些图表和解释,这可能会有所帮助。