Intel VT-d技术通过在北桥(MCH)引入DMA(Direct Memory Access,直接内存访问)重映射硬件,以提供设备重映射和设备直接分配的功能。在启用VT-d的平台上,设备所有的DMA传输都会被DMA重映射硬件截获。根据设备对应的I/O页表,硬件可以对DMA中的地址进行转换,使设备只能访问到规定的内存。使用VT-d后,设备访问内存的架构如图3-10所示。
图3-10左图中是没有启动VT-d的情况,此时设备的DMA可以访问整个物理内存。图3-10右图中是启用VT-d的情况,此时设备的DMA只能访问指定的物理内存。
图3-10 使用VT-d后设备访问内存的架构
DMA重映射技术是VT-d技术提供的最关键的功能之一,DMA重映射的基本原理是:
在进行DMA操作时,设备需要做的就是向(从)驱动程序告知的“物理地址”复制(读取)数据。然而,在虚拟机环境下,客户机使用的是GPA,那么客户机驱动操作设备也用GPA。但是设备在进行DMA操作时,需要使用MPA(Memory Physical Address,内存物理地址),于是I/O虚拟化的关键问题就是如何在操作DMA时将GPA转换成MPA。VT-d技术提供了DMA重映射技术就是来解决这个在进行DMA操作时将GPA转换成MPA的问题。
PCI总线结构通过设备标示符(BDF)可以索引到任何一条总线上的任何一个设备,而VT-d中的DMA总线传输中也包含一个BDF用于标识DMA操作发起者。除了BDF外,VT-d还提供了两种数据结构来描述PCI架构,分别是根条目(Root Entry)和上下文条目(Content Entry)。下面,将分别介绍一下这两种数据结构。
(1)根条目
根条目用于描述PCI总线,每条总线对应一个根条目。由于PCI架构支持最多256条总线,故最多可以有256个根条目。这些根条目一起构成一张表,称为根条目表(Root Entry Table)。有了根条目表,系统中每一条总线都会被描述到。图3-11是根条目的结构。
图3-11 根条目的结构
图3-11中主要字段解释如下:
P:存在位。P为0时,条目无效,来自该条目所代表总线的所有DMA传输被屏蔽。P为1时,该条目有效。
CTP(Context Table Point,上下文表指针):指向上下文条目表。
(2)上下文条目
上下文条目用于描述某个具体的PCI设备,这里的PCI设备是指逻辑设备(BDF中function字段)。一条PCI总线上最多有256个设备,故有256个上下文条目,它们一起组成上下文条目表(Context Entry Table)通过上下文条目表,可描述某条PCI总线上的所有设备。图3-12是上下文条目的结构。(www.xing528.com)
图3-12 上下文条目的结构
图3-12中主要字段解释如下。
P:存在位。为0时条目无效,来自该条目所代表设备的所有DMA传输被屏蔽。为1时,表示该条目有效。
T:类型,表示ASR字段所指数据结构的类型。目前,VT-d技术中该字段为0,表示多级页表。
ASR(Address Space Root,地址空间根):实际是一个指针,指向T字段所代表的数据结构,目前该字段指向一个I/O页表。
DID(Domsin ID,域标识符):DID可以看作用于唯一标识该客户机的标识符。
根条目表和上下文条目表共同构成了图3-13所示的两级结构。
图3-13 根条目表和上下文条目表构成的两级结构
当DMA重映射硬件捕获一个DMA传输时,通过其中BDF的bus字段索引根条目表,可以得到产生该DMA传输的总线对应的根条目。由根条目的CTP字段可以获得上下文条目表,用BDF中的{dev,func}索引该表,可以获得发起DMA传输的设备对应的上下文条目。从上下文条目的ASR字段,可以寻址到该设备对应的I/O页表此时,DMA重映射硬件就可以做地址转换了。通过这样的两级结构,VT-d技术可以覆盖平台上所有的PCI设备,并对它们的DMA传输进行地址转换。
I/O页表是DMA重映射硬件进行地址转换的核心。它的思想和CPU中分页机制的页表类似,CPU通过CR3寄存器就可以获得当前系统使用的页表的基地址,而VT-d需要借助根条目和上下文条目才能获得设备对应的I/O页表。VT-d使用硬件查页表机制,整个地址转换过程对于设备、上层软件都是透明的。与CPU使用的页表相同,I/O页表也支持多种粒度的页面大小,其中最典型的4KB页面地址转换过程如图3-14所示。
图3-14 DMA重映射的4KB页面地址转换过程
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。