接上一篇文章真真没啥技术的我学Linux驱动 | ROM Code的“接头暗号”中使用接头暗号成功让ROMCode老爷给打开了城门。
城门被打开的刹那间,整座城池在你脚下骤然苏醒。
主街(AXI总线) 已铺开琉璃甬道,32路驿马(数据线)与32面令旗(地址线)并行奔流,指令如加密的烽火在铜轨上滑出残影。
顺着AXI主街的琉璃光流向远处望去。穿过那层层由内存管理单元(MMU) 把守的、光影变幻的Cortex-A7内城城门——这里空间被重排,虚实被映射。
在数据和指令的中心,一座皇宫赫然映入眼帘,之上笼罩着取指、译码、执行的三色光芒,在里面住着CPU内核这位皇帝。
它有几个特点:
1、手速逆天:一纳秒能完成好几件惊天动地的工作(计算、判断、跳转)。
2、年轻力强但痴呆记忆力为零:工作起来不知道疲惫,没有长期记忆,工作一完成,瞬间就忘。
3、多副面孔:每一副面孔都用来运行不同模式,解决不同事情。
正因这几个特点,看似无所不能的皇帝,实则片刻离不开它身边R0,,,,,R15“寄存器贴身侍卫”,GIC“大内总管”等一众大臣。来共同维系着i.MX6ULL这座庞大城池的秩序。
那么,这位皇帝究竟有哪几副至关重要的“面孔”?围绕在他身边的侍卫与重臣班子又是如何运作的?
本篇属于第一部分 万事开头难之入门篇
多副面孔的CPU和它的寄存器侍卫
接下来就来介绍一下CPU内核皇帝的多副面孔和它的贴身侍卫们。

User (USR) 处理日常事务,就像“微服私访”,像个普通老百姓,访问的硬件资源受限。遇到冤情还是需要当地衙门来处理(没有权限修改CSPR M[4:0]来切换模式,可以靠软中断进入SVC变相换面孔,判断要干啥)。
FIQ 快速响应中断,响应极快用于处理高频率、低延迟事情。边关八百里告急,立刻化身“御驾亲征”威武大将军,拥有自己的一套 R8–R14 fiq专职寄存器侍卫,无需保存/恢复上下文,直接调兵遣将。
IRQ普通中断,处理日常边报,虽不如FIQ快,但稳扎稳打,能处理一些相对紧急事情。
Supervisor (SVC) 平民老百姓敲了登闻鼓,有冤情?发生系统调用,立刻亲自批阅。一般操作系统使用,用于系统服务。
Monitor (MON) 皇帝不为人知的秘辛(ARM TrustZone 技术,涉及敏感操作)分为(Normal World)与(Secure World),想查看像内库私产必须不能让人知道密码。
Abort (ABT) 专门处理“非法行为”。数据中止(Data Abort)或预取中止(Prefetch Abort)——比如访问了不存在的内存或权限不足。
Hyp (HYP) 化身劳模,同时成为多个国家的真命天子(虚拟化技术,同时运行多个虚拟机)。
Undef(UND) 专治“妖言惑众”(非法指令),CPU 遇到未定义指令。
System(SYS) 不想穿龙袍,但又要暗中掌控全局。与 User 相同的侍卫,但拥有特权级,可以访问Usr无法访问的资源,运行需要特权但又不想频繁切换模式的操作。






)如下图所示,bit15-bit0均不可见。
为了给皇帝换脸速度提供情绪价值-知道自己换脸前是啥样子。
发生异常后,侍卫SPSR(备份程序状态寄存器)会保存CPSR的副本换脸前的值(硬件自动处理),这样就可以知道在进入这个模式前的一些状态,哪怕在当前模式CPSR发生更改也不影响,因为SPSR记录着呢。
在结束异常响应的时候,硬件自动从SPSR恢复值到CPSR,返回前一个模式。
除此之外,当CPU皇帝在皇宫大殿(内核)日理万机时,有一群身披玄色飞鱼服、手持绣春刀的特殊侍卫在暗处守护——他们就是锦衣卫指挥使协处理器(CP0-CP15)总揽全局,每个锦衣卫指挥使下辖多个锦衣卫千户各司其职,暗中监视众多百官(通过协处理器访问其他寄存器)。
不同于R0-R15那些时刻伴随皇帝左右的“贴身侍卫”
1、每位锦衣卫都有独特的绝密腰牌(专属指令集),只有皇帝用特定密令(MRC/MCR指令)才能调遣。

coproc,值为 p0 到 p15,对应于 CP0 到 CP15。CRn 或 CRm,值为 c0 到 c15,用于指定协处理器寄存器编号。opc1 或 opc2,取值范围为 0 到 7。2、它们不直接参与皇帝的计算事务,而是掌管着城池的深层机密与防御体系。
其中最受信任和恩宠的当属CP15,下辖C0-C15 等锦衣卫千户(主寄存器),可以通过MRC、MCR组合访问不同锦衣卫(寄存器),如配置MMU、Cache、中断向量表等等。

当皇帝想看看真正的世界,感觉有个MMU中间插一档子太费劲,就说CP15你去把它给我关起来。然后,CP15就让c1和c0查了查访问方式,通过下面命令访问SCTLR寄存器来访问资源,来操作MMU。
MRC p15, 0, <Rt>, c1, c0, 0 ; Read SCTLR into RtMCR p15, 0, <Rt>, c1, c0, 0 ; Write Rt to SCTLR
SCTLR寄存器

.........看手册吧,Bit位太多了,太长了。
C 用于Cache 和缓存一致性使能位0:禁用。1:启用。
A 内存对齐检查使能。0:禁用。1:启用。
MMU 使能。0:MMU 禁用。1:MMU 启用。

如想更改中断向量表,就让CP15安排c0和c12处理,更改中断向量表映射地址。比如改到0x8000-0000位置。
ldr r0, =0X80000000 ; r0=0X80000000MCR p15, 0, r0, c12, c0, 0
....
其他没有提到的还需要根据参考资料读手册,手册很详细。
突然,一声急报,从远处响起。。。。。。
“报——!北境有烽火骤起!”
御座上的皇帝(CPU内核)眉峰一凝,CPSR侍卫腰间令牌上的I 位和F 位忽明忽暗。它知道:这不是寻常的奏章,而是中断——那些无需圣旨、直闯殿前的紧急军情。
但皇帝并不慌乱。无论哪路急报,都将惊动那位常年驻守宫门外的 GIC 大内总管(Generic Interrupt Controller)。总管手握《中断谱册》,会依紧急程度决定,决定如何跟皇帝在何处汇报,是军机处(IRQ)还是直接面圣(FIQ)?(异常处理程序-中断向量表)。
而皇帝自己,也早练就了 “瞬目换面” 的绝技。一念之间,CPSR令牌上的 M[4:0] 悄然轮转——或是化身 FIQ 大将军,直调专属的 R8–R14 侍卫亲兵;或是转为 IRQ ,借 R13_irq、R14_irq 稳住阵脚。
可这一切,究竟是如何在一瞬之间发生的?GIC 总管如何分辨敌友?皇帝换面前又如何将身后事托付给 SPSR 与 LR?那些被暂时搁置的朝政(当前任务),又该由谁在暗中保存现场?
参考资料来自
《ARM Cortex-A Series (Armv7-A) Programmer’s Guide Version 4.0》
《ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition》