《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(4)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(3)

13.1 IOMMU

13.1.2 IA处理器的VT-d

IA(Intel Architecture)处理器使用VT-d技术将PCI总线域的物理地址转换为HPA地址。这个映射过程也被称为DMA Remapping。IA处理器系统使用DMA Remapping机制可以辅助虚拟化技术对外部设备进行管理。

在IA处理器系统中,所有的外部设备都是PCI设备每一个设备都唯一对应一个Bus Number、Device Number和Function Number。为此,IA处理器设置了一个专门的结构,即Root Entry Table,管理每一棵PCI总线树(如果处理器系统有多个PCI总线树,则需要多个Root Entry Table)。在这种结构下,每一个PCI设备根据其Bus(总线)号、Device(设备)号、Function(功能)号,唯一确定一个Context Entry。VT-d将这个结构称为“Device to Domain Mapping”结构,如图13-3所示:

VT-d一共设置了两种结构描述PCI总线树结构,分别为Root EntryContext Entry。其中,Root Entry描述PCI总线,一棵PCI总线树最多有256条PCI总线,每一条PCI总线对应一个Root Entry每条PCI总线中最多有32个设备,而每个设备最多有8个Function,而每一个Function又对应一个Context Entry,因此每个Context Entry表中共有256个表项

在一个处理器系统中,一个指定的PCI Function唯一对应一个Context Entry这个Context Entry指向这个PCI Function使用的地址转换结构(Address Translation Structures)。当一个PCI Function隶属于不同的Domain时,将使用不同的地址转换结构。但是在一个时间段里,PCI Function只能使用一个地址转换结构,即Context Entry只能指向一个Domain的地址转换结构。这个地址转换结构的主要功能是完成PCI总线域到HPA存储器域的地址转换

如前文图13-1所示,当一个设备进行DMA操作时,Domain使用PCI总线域的地址填写此设备和与DMA传送相关的寄存器;当这个设备启动DMA操作时,将使用PCI总线地址,之后通过DMA Remapping机制,将PCI总线域地址转换为HPA存储器域地址;然后将数据传送到实际的物理地址空间中。而Domain通过处理器的MMU机制将GPA转换为HPA,访问物理地址空间。

图13-1 DMA-Remapping的实现

从图13-3中可以发现,每一个Function在每一个Domain中都可能有一个地址转换结构以完成GPA到HPA的转换,因此在每一个Domain中,最多有256个地址转换结构。这些结构无疑将占用内存部分,但是并不会产生较大的浪费。因为在实际设计中,同一个Domain下的所有PCI设备使用的总线地址到HPA地址的转换结构可以相同。因此在实践中,每个Domain仅使用一个地址转换结构即可。

IA处理器使能VT-d后,PCI设备进行DMA操作,需要根据Bus、Device和Function号确定Context Entry,之后使用图13-4所示的方法完成PCI总线地址到HPA地址的转换。

在上图中,4KB Page Table(页表)中的每个Entry的大小为8B(Byte),因此在计算偏移时,需要左移3位。PCI总线地址通过三级目录,最终找到与HPA对应的4KB大小的页面,从而完成PCI总线地址到HPA的转换。值得注意的是,IA处理器还支持2MB(SP=1)、1GB(SP=2)512GB(SP=3)1TB(SP=4)大小的Super Page,而本节仅使用了4KB大小的页面。

为了加快PCI总线地址到HPA地址的转换速度,IA处理器分别为Root Entry和Context Entry设置了Context Cache以加快Context Entry的获取速度同时还设置了IOTLB加速PCI总线地址到HPA地址的转换速度

IOTLB相当于I/O页表的Cache当一个PCI设备进行DMA操作时,首先在IOTLB中查找PCI总线地址与HPA地址的映射关系如果在IOTLB命中,则PCI设备直接获得HPA地址进行DMA操作如果未在IOTLB命中,则需要使用图13-4中所示的步骤进行PCI总线地址到HPA地址的转换

Intel并未公开“没有在IOTLB命中”的实现细节。当出现这种情况时,IA处理器可能使用内部的Microcode完成图13-4所示的算法。

使用VT-d,除了可以有效地支持虚拟化技术以外,还可以支持一些只能访问32位地址空间的PCI设备访问4GB之上的物理地址空间

更多内容请看下回。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-15 23:16:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-15 23:16:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-15 23:16:01       82 阅读
  4. Python语言-面向对象

    2024-02-15 23:16:01       91 阅读

热门阅读

  1. with 用法

    2024-02-15 23:16:01       58 阅读
  2. c++ 自定义Logger 日志类

    2024-02-15 23:16:01       58 阅读
  3. 个人浅见之程序员为什么不喜欢关电脑

    2024-02-15 23:16:01       55 阅读
  4. 跨域问题浅析

    2024-02-15 23:16:01       60 阅读
  5. Python概率建模算法和图示

    2024-02-15 23:16:01       54 阅读
  6. 自动化专业英语词汇积累【第一期】

    2024-02-15 23:16:01       48 阅读
  7. 011axios

    2024-02-15 23:16:01       43 阅读
  8. 广度优先搜索:一层一层探索

    2024-02-15 23:16:01       62 阅读
  9. vivado HDL编码技术

    2024-02-15 23:16:01       47 阅读
  10. 树形DP,P2279 [HNOI2003] 消防局的设立

    2024-02-15 23:16:01       58 阅读