思考: 什么时候需要disable MMU/i-cache/d-cache?
生活随笔
收集整理的這篇文章主要介紹了
思考: 什么时候需要disable MMU/i-cache/d-cache?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
快速鏈接:
.
👉👉👉 個人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
在armv8/armv9的aarch64架構(gòu)下,軟件的啟動流程:
BL1--->BL2--->BL31--->BL32--->BL33....
在不同的BL鏡像切換時,都需要disable MMU/i-cache/d-cache嗎?
我們以BL2到BL31的切換為示例,討論一下場景。
BL2—>BL31
BL2 load BL31到內(nèi)存,然后跳轉(zhuǎn)到BL31, 然后有兩種場景需要分析:
bl2 at EL3
- 如果bl2是EL3,BL31也是EL3,他們使用相同的Transslation Regime,所以在BL2跳轉(zhuǎn)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跳轉(zhuǎn)BL31的時候,需要disable MMU/i-cache,至于d-cache則無需disabled,但是如果你是BL2 load的BL31鏡像,那么在load完鏡像時,就需要flush d-cache
總結(jié):
- (1)當(dāng)BL鏡像切換的時候,只需考慮是否disable MMU/i-cache, 無需考慮是否disable d-cache;
- (2)當(dāng)BL鏡像切換的時候,如果Transslation Regime發(fā)生了變化,則無需disable MMU/i-cache
- (3)當(dāng)BL鏡像切換的時候,如果Transslation Regime沒有發(fā)生變化,則需要disable MMU/i-cache
- (4)例如uboot到kernel的切換,滿足步驟(3),所以需要disable MMU/i-cache
繼續(xù)思考
在鏡像切換的時候(程序切換的時候),為什么要關(guān)閉MMU? 為什么要關(guān)閉i-cache?
先回答第一個,為什么要關(guān)閉MMU?
因為程序1管理者程序1的頁表,它不可能去管理程序2的頁表。在剛進(jìn)入程序2的時候,跳轉(zhuǎn)指向的是物理地址,所以也就要求在進(jìn)入程序2時,需要disable MMU.
再回答第二個問題,什么也要關(guān)閉i-cache呢?
因為如果是僅僅MMU,i-cache依然也可以推測,它緩存的可能是已經(jīng)過時了的指令。跳轉(zhuǎn)到程序2后再指向時,可能會崩潰。
總結(jié)
以上是生活随笔為你收集整理的思考: 什么时候需要disable MMU/i-cache/d-cache?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: armv8/arnv9的aarch64架
- 下一篇: 各个级别镜像之间的跳转模型