71

baron · 2023年02月23日 · 江苏

思考: 什么时候需要disable MMU/i-cache/d-cache?

image.png

在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精选

推荐阅读

image.png

欢迎关注ARM精选专栏, 欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
9466
内容数
212
以易懂、渐进、有序的方式,深入探讨ARMv8/ARMv9架构的核心概念。我们将从基础知识开始,逐步深入,覆盖最新的架构,不再纠缠于过时技术。本系列内容包含但不限于ARM基础、SOC芯片基础、Trustzone、gic、异常和中断、AMBA、Cache、MMU等内容,并将持续更新。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息