接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(1)
在多进程环境下,处理器使用MMU机制,使得每一个进程都有独立的虚拟地址空间,从而在各个进程运行在独立的地址空间中,互不干扰。MMU具有两大功能:一是进行地址转换,将分属不同进程的虚拟地址转换为物理地址;二是对物理地址的访问进行权限检查,判断虚实地址转换的合理性。
在多数操作系统中,每一个进程都具有独立的页表,以存放虚拟地址到物理地址的映射关系和属性。但是如果进程每次访问物理内存时都需要访问页表,将严重影响进程的执行效率。为此,处理器设置了TLB(Translation Lookaside Buffer,旁路转换缓冲)作为页表的Cache。如果进程的虚拟地址在TLB命中时,则从TLB中直接获得物理地址,而不需要使用页表进行虚实地址的转换,从而极大地提高了访问存储器的效率。
从地址转换的角度来看,IOMMU与MMU较为类似,只是IOMMU完成的是外部设备地址到存储器地址的转换。可以将一个PCI设备模拟成为处理器系统的一个特殊进程,当这个进程访问存储器时使用特殊的MMU(即IOMMU)进行虚实地址转换,然后再访问存储器。在这个IOMMU中,同样存在IO页表存放虚实地址转换关系和访问权限,而且处理器为了加速这种虚实地址的转换,还设置了IOTLB作为IO页表的Cache。单纯从这个角度来看,许多HOST主桥和RC也具备同样的功能,如Powerp/c处理器的Inbound窗口和Outbound窗口,也可以完成这种特殊的地址转换。但是这些窗口仅能完成PCI总线域到一个存储器域的地址转换,无法实现PCI总线域到多个存储器域的转换。
目前,设置IOMMU的主要作用是支持虚拟化技术。当然,使用IOMMU也可以实现其它功能,如使“仅支持32位地址的PCI设备”访问4GB以上的存储器空间。IA处理器和AMD处理器分别使用“VT-d”和“IOMMU”实现外部设备的地址转换。这两种技术(VT-d和IOMMU)都可以将PCI总线域地址空间转换为不同的存储器域地址空间,便于虚拟化技术的设计与实现。
13.1.1 IOMMU的工作原理
根据虚拟化的理论,假设在一个处理器系统中存在两个Domain,其中一个为Domain 1、而另一个为Domain 2。这两个Domain分别对应不同的虚拟机,并使用独立的物理地址空间,分别为GPA1(GPA即Guest Physical Address)和GPA2空间,其中在Domain 1上运行的所有进程都使用GPA1空间,而在Domain 2上运行的所有进程都使用GPA2空间。
GPA1和GPA2采用独立的编码格式,其地址都可以从各自GPA空间的0x00000000地址开始,只是GPA1和GPA2空间在System Memory中占用的实际物理地址HPA(Host Physical Address)并不相同。HPA也被称为MPA(Machine Physical Address),是处理器系统中真实的物理地址。而PCI设备依然使用PCI总线域地址空间,PCI总线地址需要通过DMA-Remapping逻辑转换为HPA地址后,才能访问存储器。DMA-Remapping逻辑的组成结构如图13-1所示:
图13-1 DMA-Remapping实现
对于DMA-Remapping机制的详细讲解,放在下一回中。