x86 - INTEL VT-D 根表和上下文表关系

标签 x86 intel virtualization dma iommu

我正在尝试了解 INTEL VT-D,我读到根表有 256 个条目,每个根表指向进一步的上下文表,每个上下文表有 256 个条目,其中每个上下文表包含二级翻译。不幸的是,我无法弄清楚根表和上下文表之间的确切关系。我们有 256 * 256 上下文表条目吗?或者每个根表都指向相同的上下文表。通过查看下图,enter image description here 它说每个上下文表都有不同的总线编号,但我无法与它联系起来,如果有人告诉我二级翻译,那就太好了,我熟悉 MMU 分页,但 VT-D 分页确实令人困惑。我已经阅读了 VT-D 规范,但仍然不清楚我上面描述的一些概念。

最佳答案

在 PCIe 中,有 256 个总线编号,每个总线有 256 个设备/功能编号,总共 256*256 个功能。在 VT-d 中,每一个都可以有一个上下文条目。

根表/上下文表被组织为两级表,因此不必完全填充上下文表。每个根表条目都有一个存在位。如果当前位为 0,则该总线没有上下文表。

尽管没有什么可以排除的,但多个根表条目指向同一个上下文表是非常不寻常的。

如果您熟悉 CPU 分页,VT-d 页表结构与 EPT 非常相似(事实上,内存中相同的物理表可以同时用于这两个目的)。 VT-d 支持高达 48 位地址的两级、三级或四级分页结构(取决于硬件实现;我相信当前所有实现仅支持 4 级遍历)。

如果您有更具体的问题,我可以回答,但我认为这不是提供教程的好地方。

关于x86 - INTEL VT-D 根表和上下文表关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53294593/

相关文章:

c - 生成的汇编代码包含一系列到下一个内存位置的跳转命令,目的是什么

linux - 如何在驱动程序代码内将 Linux 中的内核空间 VA 转换为 PA?

c++ - 英特尔 C++ 编译器 : What is highest GCC version compatibility?

linux - 带有桥接适配器的 VirtualBox 上的 Debian guest 无法访问互联网

continuous-integration - 使用持续集成部署到虚拟机以运行集成测试

GCC 的 x86 语法中存在 '[' 的程序集问题

c - 在 Linux 中从 C 代码生成原始二进制文件

linux - fork: retry: 资源暂时不可用

.net - 省电 SpinWait

c - 使用一些 malloc 内存而不是使用文件来虚拟化 fopen