IOMMU的全称是Input/Output Memory Management Unit,即输入/输出内存管理单元,其主要功能链接DMA-capable I/O总线和系统内存。传统的内存管理单元MMU,是将CPU-visible的虚拟地址转换成物理地址,而IOMMU则是将Device-visible的虚拟地址转换成物理地址。例如:GART(Graphics Address RemappingTable)就是一种IOMMU,PCIE的显卡就是利用GART,将GPU的虚拟地址转换成系统内存的物理地址。但是,需要注意一点,GART不支持保护模式,而现代的IOMMU是支持保护模式的。
1.IOMMU的基本功能
1.1 IOMMU能做什么?
- 转译Device的Request;
- Device必须授权访问系统地址空间,包括:页保护,每个Device都有各自的读/写权限;
- 维护转译表的高速缓存器;
1.2 IOMMU不能做什么?
- 不是MMU的替代品,CPU访问物理内存,依然使用MMU;
- 不能支持直接请求Paged I/O,比如:1)Device和Driver无法处理任意的延迟;2)Device和Driver无法识别“I/O Page Fault”之类的错误;3)支持利用远程地址转译的方法间接地请求Page;
2. 系统拓扑结构
通常情况下,IOMMU会被部署成HT(HyperTransport)或者PCI Bridge的一部分。在高端系统中,CPU和I/O Hub之间可能会有多个HT链接,此时就需要多个IOMMU。
3. IOMMU的优点
3.1虚拟化技术
- Guest OS直接被分配到实际的Device;
- 用户空间的应用程序可以直接访问Device;
- 增强了安全性:1)增加了Device对地址空间的访问控制;2)创建I/O保护域;
- 增强了可靠性:1)Device之间是独立,互不干扰;2) 保护系统内存不被不明的Device读/写;
- 支持可信任的输入/输出:在Device和Driver之间创建了保护通道
- 让传统32位PCI设备能够访问可寻址范围之外的系统内存区域,并且避免使用Bounce Buffer