AMD-V提供的Device Exclusion Vector 扩展能提供地址空间隔离和访问控制, DEV 通过一个查询表来为每一个 PCI 设备指定一个保护域,并且为每一个保护域提供了一个访问控制位图。 IO 设备执行内存访问时,DEV 机制根据其 HyperTransport 链路及 PCI Id 确定其保护域,然后以该设备访问的地址为索引检测保护域相关的控制位图的相应位,以确定设备能否成功访问相应的物理页。DEV 每个保护域的访问控制位图是存放在系统物理内存中的。 IOMMU的功能是在GART 和 DEV 结合的基础上形成的, 其主要包括如下功能组件 : (1)设备表。 即一个按设备 ID 索引的数组,类似于 DEV 的查询表。 每个表项为其设备 ID 指定一个 IO 页表根指针及中断转换表的物理地址。 不同的设备 ID 可通过其设备表项中的指针共享 IO 页表或中断转换表。系统的全部 IOMMU 可共享一个设备表。 ( 在 AMD 平台上一般一个NUMA Node 或北桥控制器会带一个独立的 IOMMU) (2)IO页表。 不同于DEV 的位图,IO 页表是层次性的。 和 CPU MMU 使用的页表完全兼容。在 Nested Paging 情况下,对于某个被分配到虚拟机的物理设备,其IO 页表完全可以共享其虚拟机的第二维页表。 IO 页表能翻译的设备地址的范围完全取决于页表目录本身的有效 entries 覆盖的范围,不受类似于 GART Aperture 空间的限制。 (3)中断转换表。 将一个中断向量号转换成另一个向量号,并确定该中断的目标 APIC 控制器。 利用中断转换表,VMM 能控制被独占设备产生的中断。 (4)命令缓冲区。用于向 IOMMU 发送命令的环型队列结构,每个 IOMMU 单独有一个。 发送的命令一般是操作设备表或 IO 页表项的命令。 (5)事件日志缓冲区。用于IOMMU记录事件的环形队列结构,每个 IOMMU 单独有一个。 这些数据结构都是分配在系统物理内存中的,其物理地址由 IOMMU 的控制寄存器所指向。 另外在 IOMMU 内还会有地址翻译的缓存,即 IOTLB, 其运行机制和 CPU MMU 的 TLB 一致。
|