Root-Complex pci pcie 设备透传

http://blog.chinaunix.net/uid-28541347-id-5836399.html

DMA重定向硬件一般位于Root Complex中,Root-Complex是PCIe系统中引入的概念,它将CPU、内存子系统和PCIe子系连接起来。如下图所示:

而Root Complex则经常被集成到CPU芯片上、MCH(Memory Controller Hub)上或者是IOH(I/O hub)上。

DMA重定向硬件将来自于I/O子系统的内存访问请求分为两类:

  1. 不带地址空间ID的请求(Request without Process Address Space Identifier,即Request-without_PASID),相当于GPA(Guest Physical Address),这是一般Endpoint设备发出的内存访问请求,这类请求通常会表明该请求的类型(读、写或原子操作),DMA目标的地址、大小和发起请求的源设备的ID。
  2. 带有地址空间ID的请求(Request with Process Address Space Identifier,即Request-with-PASID),相当于GVA(Guest Virtual Address),能够发出这类请求的源PCI设备需要拥有virtual address capability,该请求带有额外的信息用于定位目标地址空间和一些其他信息。

不同虚拟机之间的隔离是通过防止分配到其他虚拟机的资源(CPU、I/O设备)访问到本虚拟机的物理地址。每个虚拟机都会有自己独立的物理地址空间,即GPA(Guest Physical Address)空间,该空间不同于主机物理地址空间,即HPA(Host Physical Address)空间。DMA重定向硬件将从I/O设备发过来的访问请求中包含的地址看做是DMA地址,根据不同的使用配置,该DMA地址可能是GPA;可能是跟PASID(Process Address Space ID)相关的VA(application Virtual Address);也可能是由软件定义的I/O虚拟地址(IOVA)。不管怎样,DMA重定向硬件将DMA地址最终转化为HPA(Host Physical Address)实现最终主机物理地址的访问

pCI和PCIe区别

先分别看下基于pci总线和pcie总线的拓扑图:

PCIe与PCI两者在电器特性上差别很大,这里不做主要阐述。两类总线拓扑结构上的主要变化就是PCIe支持端到端的连接,无法像PCI一样,在一条总线上挂接多个设备或桥。PCIe在软件上是兼容PCI总线的,对于这两种总线的拓扑结构是有一定的转换关系的:

对于PCIe的RC等价于PCI中的Host Bridge

device都是相同的

对于Bridge和switch的转换关系如下图

 

 

IOMMU

IOMMU功能简介

IOMMU主要功能包括DMA Remapping和Interrupt Remapping,这里主要讲解DMA Remapping,Interrupt Remapping会独立讲解。对于DMA Remapping,IOMMU与MMU类似。IOMMU可以将一个设备访问地址转换为存储器地址,下图针对有无IOMMU情况说明IOMMU作用。

在没有IOMMU的情况下,网卡接收数据时地址转换流程,RC会将网卡请求写入地址addr1直接发送到DDR控制器,然后访问DRAM上的addr1地址,这里的RC对网卡请求地址不做任何转换,网卡访问的地址必须是物理地址。

对于有IOMMU的情况,网卡请求写入地址addr1会被IOMMU转换为addr2,然后发送到DDR控制器,最终访问的是DRAM上addr2地址,网卡访问的地址addr1会被IOMMU转换成真正的物理地址addr2,这里可以将addr1理解为虚机地址。

左图是没有IOMMU的情况,对于此种情况虚机无法实现设备的透传,原因主要有两个:一是因为在没有IOMMU的情况下,设备必须访问真实的物理地址HPA,而虚机可见的是GPA;二是如果让虚机填入真正的HPA,那样的话相当于虚机可以直接访问物理地址,会有安全隐患。所以针对没有IOMMU的情况,不能用透传的方式,对于设备的直接访问都会有VMM接管,这样就不会对虚机暴露HPA

右图是有IOMMU的情况,虚机可以将GPA直接写入到设备,当设备进行DMA传输时,设备请求地址GPA由IOMMU转换为HPA(硬件自动完成),进而DMA操作真实的物理空间。IOMMU的映射关系是由VMM维护的,HPA对虚机不可见,保障了安全问题,利用IOMMU可实现设备的透传。这里先留一个问题,既然IOMMU可以将设备访问地址映射成真实的物理地址,那么对于右图中的Device A和Device B,IOMMU必须保证两个设备映射后的物理空间不能存在交集,否则两个虚机可以相互干扰,这和IOMMU的映射原理有关,后面会详细介绍。

IOMMU作用

根据上一节内容,总结IOMMU主要作用如下:

屏蔽物理地址,起到保护作用。典型应用包括两个:一是实现用户态驱动,由于IOMMU的映射功能,使HPA对用户空间不可见,在vfio部分还会举例。二是将设备透传给虚机,使HPA对虚机不可见,并将GPA映射为HPA。

IOMMU可以将连续的虚拟地址映射到不连续的多个物理内存片段,这部分功能于MMU类似,对于没有IOMMU的情况,设备访问的物理空间必须是连续的,IOMMU可有效的解决这个问题。

如下图所示,系统中存在两个Domain,1和2,也可以理解为存在两个虚拟机,这两个虚拟机发出的内存请求通过在CPU上的内存管理单元(MMU),在x86 CPU上可以理解为分页机制和EPT(Extended Page Table)的组合,将发出的内存请求地址最终转化为主机的物理内存地址,即HPA,对应到主机物理内存上。而Device 1和2,则可以理解为分别分配给Domain 1和2的I/O设备,虽然它们发出访问请求的地址数值一样,但是由于它们所属的Domain不一样,导致DMA Memory Management将会使用不同的地址转换页表,将其分别转换到不同Domain所对应的HPA。VMM/Hypervisor负责对DMA Memory Management所使用的I/O地址转换页表进行创建和维护,同时需要对DMA重定向和I/O设备进行配置,协商好使用什么类型的地址,GPA或者GVA。

 

每个DMA重定向硬件的实现可以是一个硬件单元包含整个PCI Segment,也可以是多个硬件单元,每个硬件单元各自包含PCI Segment中的部分PCI设备。系统的BIOS或者UEFI负责在系统启动的时候对VT-d硬件进行检测,并分配相应的地址空间,让系统软件能够访问到VT-d硬件及其配置寄存器。BIOS/ACPI以ACPI表的子表(DMAR:DMA Remapping Reporting ACPT Table)的形式将VT-d硬件资源描述出来,这样VMM值需要找到DMAR表,就可以对相应的VT-d硬件进行访问或配置了。

 

 

原文地址:https://www.cnblogs.com/dream397/p/13656521.html