(阅读本文前假设您已经熟悉了MMU工作原理)
什么是SMMU/IOMMU, 有什么作用:
SMMU 有MMU完全一样的能力,当设备以DMA方式工作时,连接在它上面的IOMMU/SMMU可以将设备所使用的地址进行进一步的转换,完全和MMU所作的事情一样
- SMMU如何工作
MMU工作时候需要类似如下的页表转换来支撑,同样SMMU也需要。
SMMU 页表结构更加的复杂
关键点:
StreamID: device 通过物理线连接到SMMU ,这个StreamID就是用来标识SMMU上连接的设备。想象一个8 ports hub上连接了8个物理设备,这8个设备就可以通过portID来标识,比如port 0代表第一个设备,同理steamID
STE: stream Table Entry,可以理解为SMMU页表转换的第一级索引,每一个streamID代表着一个STE,通过这个STE指向的连接可以找到真正的虚地址==》物理地址转换的页表。假设SMMU上连接着8个具体设备,每个设备都有自己的StreamID,那就有至少8个STE表项。
CD: Context Descriptor, stage 1的页表配置项,它其中的TTB0指向了真正的页表信息,比如PGD, PMD, PTE等,完全和MMU的页表转换原理一样
查找过程:
假设stream ID为16的设备发起了DMA操作(如下动作完全自动完成,前提是之前配置好了SMMU中所有的表项):
- StreamID=16, 所以从寄存器strtab_base指向的地址中找到偏移为16的STE表项
- 该表项中的s1ContexPtr指向了下一级的stage 1转换地址CD(Context Descriptor)
- CD中的TTB0指向了一个页表转换的基地址PGD
- PGD-àPMD-àPTE 完成了虚拟地址到物理地址的转换(和MMU工作原理一样)
注:
- 其中引入的VMID, ASID的原因和MMU一样,都是为了在TLB中加于区别,防止cache bouncing
- Stage2 的转换原理基本和Stage 1一致,不过没有额外的CD
- 由于懒,文中有些图从网上直接扣的,抱歉。如有侵权,请告知
参考:
https://zhuanlan.zhihu.com/p/27026590
ARM® System Memory Management Unit Architecture Specification, SMMU architecture version 3.0 and version 3.1