背景
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的映射功能,用户空间无法直接看到物理地址,这样即便恶意代码试图访问不该访问的地址也会被拦截。
一些概念

- 在Intel中叫IOMMU,在ARM中叫做SMMU
- 在iommu里面,经过iommu映射后的地址叫做iova,映射的一般是VA地址和PA地址的关系,输入是VA+PA列表,输出是iova。iova输出后,这个地址是最终会给到硬件外设。硬件拿着这个iova进行访存的时候会先

最低0.47元/天 解锁文章
2005

被折叠的 条评论
为什么被折叠?



