DMA Remapping 简介
Remapping硬件将来自于 集成在root-complex中 或 挂载在PCIE bus上的 设备的memory request分成两类:
Requests-without-PASID:这是来自于endpoint devices的普通memory requests。它们一般指明了访问类型(read/write/atomics)、DMA目的地的地址与大小、源设备标识。
Requests-with-PASID:这是来自于支持virtual memory capabilities的endpoint devices的memory requests。它们除了指明上述普通信息外,还带有附加信息:目标PASID、扩展属性等…
(注:PASID全名Process Address Space ID,来源于PCIE中的概念)
为了简单我们一般把上面两类简称为Requests-without-PASID和Requests-with-PASID,本节只讨论Requests-without-PASID
。
DMA隔离和地址翻译
什么是domain?
A domain is abstractly defined as an isolated environment in the platform, to which a subset of the
host physical memory is allocated. I/O devices that are allowed to access physical memory directly
are allocated to a domain and are referred to as the domain’s assigned devices. For virtualization
usages, software may treat each virtual machine as a domain.
简单理解domain就是一个平台隔离的环境,是host physical memory的一个子集。对虚机化来说,软件可以将每个虚拟机看作一个单独的domain。
Remapping硬件的作用是:在硬件进行进一步处理(例如:address decoding, snooping of processor caches, and/or forwarding to the memory controllers)之前,将memory request中的地址转换成host physical address。
Source Identifier
source-id:用于标识I/O transaction的发起者。 对于PCIE设备,其source-id位于PCI-Express transaction layer header中,由Bus/Device/Function组成。
同时为了能够记录直通设备和每个Domain的关系,VT-d引入了root-entry/context-entry的概念,通过查询root-entry/context-entry表就可以获得直通设备和Domain之间的映射关系。
Root-Entry
root-table 是4KByte的大小,共包括了256项root-entry,分别覆盖了PCI的Bus0-255,bus号应该索引root-entry,每个root-entry占16-Byte,记录了当前PCI Bus上的设备映射关系,通过PCI Bus Number进行索引。 Root-table的基地址存放在Root Table Address Register当中。Root-entry中记录的关键信息有:
- Present Flag:代表着该Bus号对应的Root-Entry是否呈现,CTP域是否初始化;
- Context-table pointer (CTP):CTP记录了当前Bus号对应点Context Table的地址。
Context-entry
同样每个context-table也是一个4K页,记录一个特定的PCI设备和它被分配的Domain的映射关系,即对应Domain的DMA地址翻译结构信息的地址。 每个root-entry包含了该Bus号对应的context-table指针,指向一个context-table,而每张context-table包又含256个context-entry, 其中每个entry对应了一个Device Function号所确认的设备的信息。通过2级表项的查询我们就能够获得指定PCI被分配的Domain的地址翻译结构信息。Context-entry中记录的信息有:
- Present Flag:表示该设备对应的context-entry是否被初始化,如果当前平台上没有该设备Preset域为0,索引到该设备的请求也会被block掉。
- Translation Type:表示哪种请求将被允许;
- Address Width:表示该设备被分配的Domain的地址宽度;
- Second-level Page-table Pointer:二阶页表指针提供了DMA地址翻译结构的HPA地址(这里仅针对Requests-without-PASID而言);
- Domain Identifier: Domain标志符表示当前设备的被分配到的Domain的标志,硬件会利用此域来标记context-entry cache,这里有点类似VPID的意思;
- Fault Processing Disable Flag:此域表示是否需要选择性的disable此entry相关的remapping faults reporting
DMA隔离和地址翻译
VT-d中引入root-table和context-table的目的比较明显,这些额外的table的存在就是为了记录每个直通设备和其被分配的Domain之间的映射关系。 有了这个映射关系后,DMA隔离的实现就变得非常简单。 IOMMU硬件会截获直通设备发出的请求,然后根据其Request ID查表找到对应的Address Translation Structure即该Domain的IOMMU页表基地址, 这样一来该设备的DMA地址翻译就只会按这个Domain的IOMMU页表的方式进行翻译,翻译后的HPA必然落在此Domain的地址空间内(这个过程由IOMMU硬件中自动完成), 而不会访问到其他Domain的地址空间,这样就达到了DMA隔离的目的。
DMA地址翻译的过程和虚拟地址翻译的过程是完全一致的,唯一不同的地方在于MMU地址翻译是将进程的虚拟地址(HVA)翻译成物理地址(HPA),而IOMMU地址翻译则是将虚拟机物理地址空间内的GPA翻译成HPA。IOMMU页表和MMU页表一样,都采用了多级页表的方式来进行翻译。例如,对于一个48bit的GPA地址空间的Domain而言,其IOMMU Page Table共分4级,每一级都是一个4KB页含有512个8-Byte的目录项。和MMU页表一样,IOMMU页表页支持2M/1G大页内存,同时硬件上还提供了IO-TLB来缓存最近翻译过的地址来提升地址翻译的速度。
图片加载失败了
感谢反馈,我看一下
图片丢失了
。。。。