快速链接:
- 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈
在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后再指向时,可能会崩溃。
关注"Arm精选"公众号,备注进ARM交流讨论区。