0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

開啟MMU會出現(xiàn)的問題及解決方案

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者: baron ? 2022-06-15 08:55 ? 次閱讀

作者簡介:

Baron (csdn:代碼改變世界ctw),九年手機安全/SOC底層安全開發(fā)經(jīng)驗。擅長trustzone/tee安全產(chǎn)品的設(shè)計和開發(fā)

注:說明本文的介紹都是基于armv8-aarch64或armv9硬件架構(gòu)

在mmu未開啟階段,PC操作的都是物理地址執(zhí)行程序,這樣看起來一切正常,沒啥問題。

例如:取指(到物理地址0x4000處取指)、譯碼、執(zhí)行取指(物理地址0x4004處取指)、譯碼、執(zhí)行取指(物理地址0x4008處取指)、譯碼、執(zhí)行取指(物理地址0x400C處取指)、譯碼、執(zhí)行

但是呢,假如程序在執(zhí)行的過程中,你突然打開了MMU,那么會發(fā)生什么呢?比如在前面的示例中,就會出現(xiàn),程序本來執(zhí)行在0X4000、0x4004處好好的,而0x4004切好是enable_mmu指令,那么接下來PC將取值0x4008處地址的指令,由于此時MMU已經(jīng)被打開了,那么0x4008會被當(dāng)作虛擬地址,經(jīng)過MMU翻譯...

經(jīng)過MMU,那么就可能出現(xiàn)了兩種問題:一是虛擬地址0x4008所對應(yīng)的頁表沒有建立,此時會產(chǎn)生prefetch abort;二是虛擬地址0x4008所對應(yīng)的頁表已經(jīng)建立了(例如指向物理0x9004處),那么此時cpu期望訪問物理地址0x4008處的,就被突然變成了訪問物理地址0x9004處了。

取指(到到物理地址0x4000處取指)、譯碼、執(zhí)行取指(物理地址0x4004處取指)、譯碼、執(zhí)行 -- 這條指令是開啟MMU取指(到虛擬地址0x4008處取指,經(jīng)MMU單元后,要么是invalid,要么是0x9004)、譯碼、執(zhí)行......

d490aaa8-ec3f-11ec-ba43-dac502259ad0.png

為了解決上述描述的問題,下面給出了兩種解決方案:第一種方案:在開啟MMU之前,我先對正在執(zhí)行的這一小塊代碼建立個頁表(一一映射),那么此時的邏輯就變成了:

取指(到到物理地址0x4000處取指)、譯碼、執(zhí)行取指(物理地址0x4004處取指)、譯碼、執(zhí)行 -- 這條指令是開啟MMU取指(到虛擬地址0x4008處取指,經(jīng)MMU單元后,物理地址依然是是0x4008)、譯碼、執(zhí)行 -- 程序沒有跑飛......

d4a2db1a-ec3f-11ec-ba43-dac502259ad0.png

第二種方案:在開啟MMU之前,我確實建立個頁表(不是一一映射哦,這是正常業(yè)務(wù)的頁表),此時的邏輯如下:

取指(到到物理地址0x4000處取指)、譯碼、執(zhí)行取指(物理地址0x4004處取指)、譯碼、執(zhí)行 -- 這條指令是開啟MMU取指,到虛擬地址0x4008處取指,經(jīng)MMU單元時在頁表是找不到0x4008這個虛擬地址的(因為沒做map),所以會產(chǎn)生prefetch abort異常、而在異常代碼ERET返回時,正好返回到0xXXXX地址處,該地址是虛擬地址,正好MAP到0x4008物理地址,程序得到繼續(xù)執(zhí)行,譯碼、執(zhí)行 -- 程序很順利哦......

d4b714f4-ec3f-11ec-ba43-dac502259ad0.png

如果看到此處,您沒有看懂,沒關(guān)系,請看下列代碼示例:

d4caa3a2-ec3f-11ec-ba43-dac502259ad0.png

程序在(1)處將 mmu_on_addr鏈接地址(虛擬地址)寫入到了X30寄存器中程序在(2)處enable MMU,此時下一條指令取指,將被當(dāng)作成虛擬地址,經(jīng)過MMU翻譯,而對應(yīng)的頁表中自然是沒有這個地址(物理地址被當(dāng)作成的虛擬地址),所以此時將產(chǎn)生sync abort...程序在(3)處不會被執(zhí)行,因為上面已經(jīng)sync abort了

跳轉(zhuǎn)到sync abort后,代碼如下方所示,什么都沒干,直接ret返回了。


	
  1. vector_entry sync_exception_sp_elx

  2. ret

ret指令返回的,PC自然是自動指向X30地址處,即 mmu_on_addr鏈接地址(虛擬地址),程序繼續(xù)跑,一切步入正常流程...

原文標(biāo)題:Baron:程序運行過程中突然打開MMU會怎么樣?

文章出處:【微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 指令
    +關(guān)注

    關(guān)注

    1

    文章

    606

    瀏覽量

    35617
  • 程序
    +關(guān)注

    關(guān)注

    116

    文章

    3756

    瀏覽量

    80751
  • MMU
    MMU
    +關(guān)注

    關(guān)注

    0

    文章

    91

    瀏覽量

    18248

原文標(biāo)題:Baron:程序運行過程中突然打開MMU會怎么樣?

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    TLE9879開啟看門狗后不喂狗也不會出現(xiàn)復(fù)位的現(xiàn)象是為什么?

    開啟看門狗后不喂狗也不會出現(xiàn)復(fù)位的現(xiàn)象,用官方例程也是一樣的效果,有人遇到過這個情況嗎?
    發(fā)表于 02-19 07:06

    uart串口和mqtt同時啟用,開啟藍牙掃描就會出現(xiàn)wifi連接超時和mqtt心跳包收不到的情況,為什么?

    uart串口和mqtt同時啟用,這時候開啟藍牙掃描就會出現(xiàn)wifi連接超時和mqtt心跳包收不到的情況。 也可以是我藍牙掃描和mqtt在共存時,這時加上一個uart就會出現(xiàn)wifi超時,mqtt
    發(fā)表于 06-05 06:06

    立體智慧倉儲解決方案.#云計算

    解決方案智能設(shè)備
    學(xué)習(xí)電子知識
    發(fā)布于 :2022年10月06日 19:45:47

    關(guān)于頁表和MMU的問題

    剛開始學(xué),好多東西都云里霧里的TT為什么在bootloader里要進行頁表初始化然后開啟MMU,然后在進入內(nèi)核后還要創(chuàng)建頁表開啟MMU?這兩個有什么不一樣么?s3c2410,bootl
    發(fā)表于 05-06 17:25

    有對MMU比較了解的嗎?

    我最近在寫一個MMU的裸機程序,但是無論怎么映射都不行,一旦開啟MMU,程序就會卡住。我想問的是寫MMU的程序?qū)︽溄幽_本和程序本身有什么特別的要求嗎?我的映射代碼如下(0~0x6000
    發(fā)表于 01-10 21:43

    裸機MMU實驗出現(xiàn)以下問題該怎么辦?

    剛接觸裸板程序,自己編mmu,make出問題,然后用韋老師MMU實驗代碼,make也出現(xiàn)問題如圖,
    發(fā)表于 08-28 22:42

    為什么使用STM32F103的RTC會出現(xiàn)外部的晶振不起振現(xiàn)象呢

    為什么使用STM32F103的RTC會出現(xiàn)外部的晶振不起振現(xiàn)象呢?有什么解決方案嗎?
    發(fā)表于 11-24 06:44

    am335x裸機開啟mmu和cache后,ucos2任務(wù)不能調(diào)度如何排查?

    beaglebone 開啟mmu和cache后,ucos2卡在 OSStartHighRdy,無法調(diào)度任務(wù),請問如何排查?
    發(fā)表于 01-12 06:41

    為什么筆記本會出現(xiàn)暗屏

    為什么筆記本會出現(xiàn)暗屏   您好,為什么筆記本會出現(xiàn)暗屏呢? 屏暗是怎樣產(chǎn)生呢?普遍有以下4種情況:第一種是燈管出
    發(fā)表于 01-21 11:27 ?815次閱讀

    MMU和頁表工作機制的簡單評析

    對于一個有MMU的CPU而言,MMU開啟后,CPU是這樣尋址的:CPU任何時候,一切時候,發(fā)出的地址都是虛擬地址,這個虛擬地址發(fā)給MMU后,MMU
    的頭像 發(fā)表于 02-02 14:08 ?1.1w次閱讀
    對<b class='flag-5'>MMU</b>和頁表工作機制的簡單評析

    MacBook Air會出現(xiàn)防反射涂層問題

    蘋果本周在與蘋果授權(quán)服務(wù)提供商共享的備忘錄中指出,配備Retina顯示屏的MacBook Air型號可能會出現(xiàn)防反射涂層問題。備忘錄指出:“某些MacBook,MacBook Air和MacBook Pro電腦上的視網(wǎng)膜顯示屏可能會出現(xiàn)防反射涂層問題?!?/div>
    的頭像 發(fā)表于 03-27 14:39 ?2897次閱讀

    內(nèi)存條壞了電腦會出現(xiàn)什么現(xiàn)象

    內(nèi)存條壞了電腦會出現(xiàn)什么狀況呢,下面我們來告訴你吧。內(nèi)存條壞了電腦會出現(xiàn)以下狀況:
    發(fā)表于 06-17 10:33 ?3.6w次閱讀

    為什么要用MMU?為什么要用虛擬地址?

    既然MMU開啟后,硬件會自動的將虛擬地址轉(zhuǎn)換成物理地址,那么還需要我們軟件做什么事情呢?即創(chuàng)建一個頁表翻譯都需要做哪些事情呢?或者說啟用一個MMU需要軟件做什么事情呢?
    的頭像 發(fā)表于 04-26 14:37 ?4799次閱讀

    Wi-Fi 6 開啟物聯(lián)網(wǎng)解決方案

    新技術(shù)星期二:Wi-Fi 6 開啟物聯(lián)網(wǎng)解決方案
    的頭像 發(fā)表于 12-30 09:40 ?748次閱讀

    為什么我的電源會出現(xiàn)振鈴和過熱?

    重點分析 電感問題。設(shè)計人員為了獲得各種優(yōu)勢,例如減少輸出紋波和盡量縮減解決方案尺寸,往往會選擇超出推薦范圍的電感值。然而,選擇電感值過大或過小的元件都會導(dǎo)致意想不到 的后果,可能會造成芯片嚴(yán)重?fù)p壞
    的頭像 發(fā)表于 05-22 12:52 ?326次閱讀
    為什么我的電源<b class='flag-5'>會出現(xiàn)</b>振鈴和過熱?