2.3.1 Intel VT-d
Intel VT-d技术通过在北桥(MCH)引入DMA(Direct Memory Access,直接内存存取)重映射硬件,以提供设备重映射和设备直接分配的功能。在启用VT-d的平台上,设备所有的DMA传输都会被DMA重映射硬件截获。根据设备对应的I/O页表,硬件可以对DMA中的地址进行转换,使设备只能访问到规定的内存。使用VT-d后,设备访问内存的架构如图2-9所示。
图2-9 使用VT-d后设备访问内存的架构
图2-9(a)是未启动VT-d的情况,此时设备的DMA可以访问整个物理内存。图2-9(b)是启用VT-d的情况,此时设备的DMA只能访问指定的物理内存。
DMA重映射技术是VT-d技术提供的最关键的功能之一,下面将研究DMA重映射的基本原理。在进行DMA操作时,设备需要做的就是向(从)驱动程序告知的“物理地址”复制(读取)数据。然而,在虚拟机环境下,客户机使用的是GPA,那么客户机驱动操作设备也用GPA。但是,设备在进行DMA操作时,需要使用内存物理地址(Memory Physical Address,MPA),于是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)。有了根条目表,系统中每一条总线都会被描述到。图2-10所示为根条目的结构。
图2-10 根条目的结构
图2-10中主要字段解释如下:
(1)P:存在位。P为0时,条目无效,来自该条目所代表总线的所有DMA传输被屏蔽;P为1时,该条目有效。
(2)CTP(Context Table Point,上下文表指针):指向上下文条目表。
2.上下文条目
上下文条目用于描述某个具体的PCI设备,这里的PCI设备是指逻辑设备(BDF中的function字段)。一条PCI总线上最多有256个设备,故有256个上下文条目,它们一起组成上下文条目表(Context Entry Table)。通过上下文条目表,可描述某条PCI总线上的所有设备。图2-11所示为上下文条目的结构。
图2-11 上下文条目的结构
图2-11中主要字段解释如下:
(1)P:存在位。P为0时条目无效,来自该条目所代表设备的所有DMA传输被屏蔽;P为1时,表示该条目有效。
(2)T:类型,表示ASR字段所指数据结构的类型。目前,VT-d技术中该字段为0,表示多级页表。
(3)DID(Domain ID,域标识符):可以看作用于唯一标识该客户机的标识符。
根条目表和上下文条目表共同构成了图2-12所示的两级结构。
图2-12 根条目表和上下文条目表构成的两级结构
当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页面地址转换过程如图2-13所示。
图2-13 DMA重映射的4KB页面地址转换过程