首页 理论教育PCIExpress体系结构导读:IOMMU的工作原理解析

PCIExpress体系结构导读:IOMMU的工作原理解析

【摘要】:在这个处理器系统中存在两个PCIe设备,分别为EP1和EP2,其中EP1隶属于Do-main1,而EP2隶属于Domain2,即EP1和EP2进行DMA操作时只能访问Domain1和Do-main2对应的HPA空间,但是EP1和EP2作为一个PCIe设备,并不知道处理器系统进行的这种绑定操作,EP1和EP2依然使用PCI总线域的地址进行正常的数据传送。Domain1和Domain2填写EP1和EP2的DMA写地址和长度寄存器启动DMA操作。EP1和EP2使用的I/O页表已经事先被VMM设置完毕,TA将使用Domain1或者Do-main2的I/O页表,进行地址翻译。

根据虚拟化的理论,假设在一个处理器系统中存在两个Domain,其中一个为Domain 1,而另一个为Domain 2。这两个Domain分别对应不同的虚拟机,并使用独立的物理地址空间,分别为GPA1(GPA即Guest Physical Address)和GPA2空间,其中在Domain 1上运行的所有进程使用GPA1空间,而在Domain 2上运行的所有进程使用GPA2空间。

GPA1和GPA2采用独立的编码格式,其地址都可以从各自GPA空间的0x0000-0000地址开始,只是GPA1和GPA2空间在System Memory中占用的实际物理地址HPA(Host Physi-cal Address)并不相同,HPA也被称为MPA(Machine Physical Address),是处理器系统中真实的物理地址。而PCI设备依然使用PCI总线域地址空间,PCI总线地址需要通过DMA-Remapping逻辑转换为HPA地址后,才能访问存储器。DMA-Remapping逻辑的组成结构如图13-1所示。

978-7-111-29822-9-Part02-196.jpg

图13-1 DMA-Remapping的实现

在以上处理器模型中,假设存在两个外部设备Device A和Device B。这两个外部设备分属于不同的Domain,其中Device A属于Domain 1,而Device B属于Domain 2。在同一段时间内,Device A只能访问Domain 1的GPA1空间,也只能被Domain 1操作;而Device B只能访问GPA2空间,也只能被Domain 2操作。Device A和Device B通过DMA-Remmaping机制最终访问不同Domain的存储器。

使用这种方法可以保证Device A/B访问的空间彼此独立,而且只能被指定的Domain访问,从而满足了虚拟化技术要求的空间隔离。这一模型远非完美,如果每个Domain都可以自由访问所有外部设备当然更加合理,但是单纯使用VT-d机制还不能实现这种访问机制。

在这种模型之下,Device A/B进行DMA操作时使用的物理地址仍然属于PCI总线域的物理地址,Device A/B仍然使用地址路由或者ID路由进行存储器读写TLP的传递。值得注意的是虽然在x86处理器系统中,这个PCI总线地址与GPA地址一一对应且相等,但是这两个地址所代表的含义仍然完全不同。

GPA地址为存储器域的地址,隶属于不同的Domain,而PCI设备使用的地址依然是PCI总线域的物理地址,只是在虚拟化环境下,PCI设备与Domain间有明确的对应关系。当这个PCI设备进行DMA读写时,TLP首先到达地址转换部件TA(Translation Agent),并通过ATPT[111](Address Translation and Protection Table)后将PCI总线域的物理地址转换为与GPA地址对应的HPA地址,然后对主存储器进行读写操作。其转换关系如图13-2所示。

978-7-111-29822-9-Part02-197.jpg

图13-2 PCI总线域物理地址与HPA的关系

在上图所示的处理器系统中,存在两个虚拟机,其使用的地址空间分别为GPA Domain1和GPA Domain2。假设每个GPA Domain使用1GB大小的物理地址空间,而且Domain间使用的地址空间独立,其地址范围都为0x0000-0000~0x4000-0000。其中Domain 1使用的GPA地址空间对应的HPA地址范围为0x0000-0000~0x3FFF-FFFF;Domain 2使用的GPA地址空间对应的HPA地址范围为0x4000-0000~0x7FFF-FFFF。在一个处理器系统中,不同的虚拟机使用的物理空间是隔离的。

在这个处理器系统中存在两个PCIe设备,分别为EP1和EP2,其中EP1隶属于Do-main1,而EP2隶属于Domain2,即EP1和EP2进行DMA操作时只能访问Domain1和Do-main2对应的HPA空间,但是EP1和EP2作为一个PCIe设备,并不知道处理器系统进行的这种绑定操作,EP1和EP2依然使用PCI总线域的地址进行正常的数据传送。因为处理器系统的这种绑定操作由TA和ATPT决定,而对PCIe设备透明。在EP1和EP2进行DMA操作时,当TLP到达TA和ATPT,经过地址转换后,才能访问实际的存储器空间。(www.chuimin.cn)

下面以EP1和EP2进行DMA写操作为例,说明在这种虚拟化环境下,不同种类地址的转换关系,其步骤如下所示。

(1)Domain1和Domain2填写EP1和EP2的DMA写地址和长度寄存器启动DMA操作。

其中EP1最终将数据写入到GPA1的0x1000-0000~0x1000-007F这段数据区域,而EP2最终将数据写入到GPA2的0x1000-0000~0x1000-007F这段数据区域。然而EP1和EP2仅能识别PCI总线域的地址。Domain1和Domain2填入EP1和EP2的DMA写地址为0x1000-0000,而长度为0x80,这些地址都是PCI总线地址。

在x86处理器系统中,这个地址与GPA1和GPA2存储器域的地址恰好相等,但是这个地址仍然是PCI总线域的地址,只是由于IOMMU的存在,相同的PCI总线地址,可能被映射到相同的GPA地址空间,然而这些GPA地址空间对应的HPA地址空间不同。这个PCI总线地址仍然在RC中被转换为存储器域地址,并由TA转换为合适的HPA地址。

(2)EP1和EP2的存储器写TLP到达RC。

来自EP1和EP2存储器写TLP经过地址路由最终到达RC,并由RC将TLP的地址字段转发到TA和ATPT,进行地址翻译。

EP1和EP2使用的I/O页表已经事先被VMM设置完毕,TA将使用Domain1或者Do-main2的I/O页表,进行地址翻译。EP1隶属于Domain1,其地址0x1000-0000(PCI总线地址)被翻译为0x1000-0000(HPA);而EP2隶属于Domain2,其地址0x1000-0000(PCI总线地址)被翻译为0x5000-0000(HPA)。值得注意的是在TA中设置了IOTLB,以加速I/O页表的翻译效率,因此TA并不会每次都从存储器中查找I/O页表。

(3)来自EP1和EP2存储器写TLP的数据将被分别写入到0x1000-0000~0x1000-007F和0x5000-0000~0x5000-007F这两段数据区域。

(4)Domain1和Domain2都使用0x1000-0000~0x1000-007F这段GPA地址访问来自EP1和EP2的数据,这个GPA地址将转换为HPA地址,然后发向存储器控制器。在IA处理器系统中,使用EPT和VPID技术进行GPA地址到HPA地址的转换。

IA处理器和AMD处理器使用不同的技术,实现TA和ATPT。其中IA处理器使用VT-d技术,而AMD使用IOMMU。从工作原理上看,这两种技术类似,但是在实现细节上,两者有较大区别。