背景
IOMMU(Input/Output Memory Management Unit)输入输出内存管理单元
iommu到底是做什么的?很多文章都介绍过,但总是会云里雾里。我想我这篇也会如此。不过先把最核心结论(略显片面但能见本质)放前面吧:
iommu是用于CPU外围设备(简称外设,比如网卡)访问主存(DDR)的时候在外设和DDR之间的一道屏障。
以PCIe网卡为例,比如网卡收到包之后,网卡里面的DMA将数据包存储到DDR不能直接访问DDR,需要先发送携带访问地址的PCIe报文到IOMMU,IOMMU检查通过合法性之后,再将访问地址转化为实际的DDR 物理地址PA,然后将数据包写入主存。这里iommu起到的就是一层屏障的作用。
缘起
iommu在实际业务场景中应用最多的是云计算需要开启多租户场景,主要是为了多租户之间安全隔离。对于云计算场景单租户场景开的少一些,不过主要是为了性能。
iommu的出现从芯片设计上需要多一个硬件模块,既增加了功耗也增加了芯片面积提高了芯片成本。带来的真正受益到底是什么?
是性能?安全?
可能主要是为了多租场景的安全,为了多租安全隔离。云多租场景的广泛应用极大加强了这个技术的推广和发展。
有了IOMMU,对于一些用户态驱动程序的开发提供了安全的环境。由于IOMMU的映射功能,用户空间无法直接看到物理地址,这样即便恶意代码试图访问不该访问的地址也会被拦截。