linux-kernel - 在 x86 平台上,IOMMU 是否默认翻译了 PCI 事务中的地址?
问题描述
我知道 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也有一些图表和解释,这可能会有所帮助。
推荐阅读
- r - 如何在 ggplot2 中的轴标签下方添加一条线?
- android - 出于安全原因,如何将 awsconfiguration.json 文件内容直接集成到我的 android studio 应用程序的代码中?
- typescript - 打字稿:以符号为键解构对象
- python - 如何允许 exec 在 python 的嵌套方法中访问自由变量?
- laravel - 如何用嘲讽来模拟内部调用
- laravel - 是否可以在 Laravel 视图作曲家中获取会话变量并调用 API?
- javascript - 使用 gulp v4 重构的监视任务不起作用
- sql - 如何在 postgreSQL 的一行中获取多个值?
- javascript - 如何根据下拉选择使用单选按钮显示数据?
- c++ - 如何修改函数内部的字符数组?