ver0.1
[看前序文章有惊喜,关注W\X\G=Z+H=“浩瀚架构师”,可以解锁全部文章]
前言
我们在介绍ARM的内存体系的时候,行文中经常讲MMU比作PE-Cores的带刀护卫。按照这个逻辑,那么SMMU也可以称之为总线上各个Master(设备)的带刀护卫,利刃出鞘之后,任何驱动送过来的地址都会被翻译成正确的物理地址、内存中数据也会得到相应的保护、共享SMMU的各个设备也会和睦相处,任何不安守本分的行为都会被惩罚,抛出异常让CPU这个总司令去处理。虽然大家同为带刀护卫,但是工作的场景还是有所区别的,前面我们虽然做了一些介绍,但是偏于原理性质的居多。本文我们会结合具体上下文,讲述一下SMMU在不同的阶段是如何工作的,以及这些工作的意义。最后我们打算花一点时间,简要介绍一下独立形态工作的SMMU的虚拟化架构。俗话说谁还不是个宝宝,就算是好兄弟也是有所区别的,希望大家对SMMU这个设备架构了解之后,能建立起对SMMU正确的认知,毕竟人和人还是不一样的。
同样的道理,SMMU的相关背景知识,我们已经写了三篇文章做了介绍。还没有看过的同学,建议大家不着急越读本文,先去看看前序的文章,建立起对SMMU的感觉。
(1) [A-21]ARMv8/v9-SMMU系统架构和功能概述
(2) [A-22]ARMv8/v9-SMMU多级页表架构
(3) [A-23]ARMv8/v9-SMMU-设备虚拟地址翻译(设备页表映射)
正文
前文中已经介绍了SMMU的工作模式,SMMU是支持两级地址翻译的,但是经过Bypass的配置可以实现多种组合的工作方式。下面我们先进入SMMU只工作在Stage-1阶段模式的场景,在这个基础上再介绍SMMU工作在Stage-2阶段模式的场景。
1.1 Stage-1 USE Case(Linux Kernel中的SMMU)
我们结合Linux系统来说明SMMU的在Stage-1阶段的用法。原因是Linux是宏内核且开源,EL0/El1空间界限相对清晰,帮助文档比较完善,而且都是业界的顶级公司和大牛在做长期维护,质量和水平那是绝对值得信赖的。看一下Kernel中一个比较经典的例子,如图1-1所示。
Kernel的Document中对这个例子有如下的描述:
• During the enumeration process, the kernel learns about I/O devices and their MMIO space and the host bridges that connect them to the system. For example, if a PCI device has a BAR, the kernel reads the bus address (A) from the BAR and converts it to a CPU physical address (B). The address B is sto