在armv8/armv9的aarch64架构下,软件的启动流程:BL1--->BL2--->BL31--->BL32--->BL33....
在不同的BL镜像切换时,都需要disable MMU/i-cache/d-cache吗?我们以BL2到BL31的切换为示例,讨论一下场景。
BL2--->BL31
BL2 load BL31到内存,然后跳转到BL31, 然后有两种场景需要分析:
bl2 at EL3
- 如果bl2是EL3,BL31也是EL3,他们使用相同的Transslation Regime,所以在BL2跳转BL31的时候,需要disable MMU/i-cache,至于d-cache则无需disabled,但是如果你是BL2 load的BL31镜像,那么在load完镜像时,就需要flush d-cache
bl2 at S-EL1
- 如果bl2是aarch64,那么BL2是S-EL1,BL31是EL3,他们有着不同的Transslation Regime, 所以就不需要disable MMU/i-cache了,至于d-cache则无需disabled,但是如果你是BL2 load的BL31镜像,那么在load完镜像时,就需要flush d-cache
- 如果bl2是aarch32, 那么BL2是S-EL1,BL31也是S-EL1,他们使用相同的Transslation Regime,所以在BL2跳转BL31的时候,需要disable MMU/i-cache,至于d-cache则无需disabled,但是如果你是BL2 load的BL31镜像,那么在load完镜像时,就需要flush d-cache
总结:
- (1)当BL镜像切换的时候,只需考虑是否disable MMU/i-cache, 无需考虑是否disable d-cache;
- (2)当BL镜像切换的时候,如果Transslation Regime发生了变化,则无需disable MMU/i-cache
- (3)当BL镜像切换的时候,如果Transslation Regime没有发生变化,则需要disable MMU/i-cache
- (4)例如uboot到kernel的切换,满足步骤(3),所以需要disable MMU/i-cache
继续思考
在镜像切换的时候(程序切换的时候),为什么要关闭MMU?为什么要关闭i-cache?
先回答第一个,为什么要关闭MMU?因为程序1管理者程序1的页表,它不可能去管理程序2的页表。在刚进入程序2的时候,跳转指向的是物理地址,所以也就要求在进入程序2时,需要disable MMU.
再回答第二个问题,什么也要关闭i-cache呢?因为如果是仅仅MMU,i-cache依然也可以推测,它缓存的可能是已经过时了的指令。跳转到程序2后再指向时,可能会崩溃。
作者:baron
文章来源:ARM精选
推荐阅读
- 硬核:context switch的切换过程(TTBR0的切换/ASID的介绍)
- 思考:Linux Kernel的中断处理函数中是否会被其它程序(中断/异常)打断?
- SMMU学习这一篇就够了(软件硬件原理/模型导读)
欢迎关注ARM精选专栏, 欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。