我知道PCI具有称为ATS的功能,可以将虚拟地址转换为物理地址,但是我不确定在当前的x86平台上是否默认启用它。
如果是,如何在Linux系统中生成虚拟地址和相应的页表?
这就是我现在想的。首先,诸如pci_map_ *之类的DMA API将调用intel iommu驱动程序来设置页表并获取io虚拟地址。其次,PCI设备将使用该虚拟io地址开始事务,而vt-d会将该虚拟io地址转换为物理地址。我说的对吗?
答案 0 :(得分:0)
目前还没有任何支持ATS的Intel CPU。但是,可以在以下位置获得Intel 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上还有一些图表和说明,可能会有所帮助。