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

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

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

什么是MPU?MPU在哪些方面保護(hù)內(nèi)存安全?

strongerHuang ? 來(lái)源:麥克泰技術(shù) ? 2023-06-12 09:06 ? 次閱讀

內(nèi)存保護(hù)單元(MPU)是一種硬件機(jī)制,通過(guò)只允許代碼訪(fǎng)問(wèn)需要的內(nèi)存和外設(shè)來(lái)提高嵌入式設(shè)備的安全性。應(yīng)用程序可以組織為進(jìn)程(process),每個(gè)進(jìn)程訪(fǎng)問(wèn)自己的內(nèi)存和外設(shè)。MPU不僅阻止應(yīng)用程序代碼訪(fǎng)問(wèn)其指定區(qū)域以外的內(nèi)存或外設(shè),而且還可以用于檢測(cè)堆棧溢出。

我們基于ARM Cortex-M MCU中的MPU,討論一下MPU所提供的一些特性。

什么是MPU?

MPU:Memory Protection Unit,內(nèi)存保護(hù)單元。它是一種硬件機(jī)制,只允許需要訪(fǎng)問(wèn)某些資源的代碼訪(fǎng)問(wèn)相應(yīng)的內(nèi)存和外設(shè)。 MPU常用于安全關(guān)鍵應(yīng)用,如醫(yī)療設(shè)備、航空電子設(shè)備、工業(yè)控制、核電站等,提高嵌入式應(yīng)用的穩(wěn)定性和安全性。

IoT應(yīng)用中,也可以通過(guò)MPU限制對(duì)內(nèi)存和外設(shè)的訪(fǎng)問(wèn),提高產(chǎn)品的安全性。例如,可以通過(guò)MPU機(jī)制隱藏加密密鑰以拒絕攻擊者訪(fǎng)問(wèn);使用MPU隔離Flash控制器也可以防止攻擊者更改應(yīng)用程序,只允許受信任的代碼執(zhí)行代碼更新。
通過(guò)MPU將RTOS任務(wù)劃分為進(jìn)程,如圖1所示。每個(gè)進(jìn)程可以包含任意數(shù)量的任務(wù)。進(jìn)程內(nèi)的任務(wù)可以訪(fǎng)問(wèn)分配給該進(jìn)程的內(nèi)存和外設(shè)。增加MPU時(shí),從任務(wù)的角度幾乎不用更改,除非任務(wù)之間存在交互。

83a1f33c-08b7-11ee-962d-dac502259ad0.png

圖1 應(yīng)用隔離為進(jìn)程

進(jìn)程間可以通過(guò)共享內(nèi)存進(jìn)行通信,兩個(gè)進(jìn)程的MPU配置表中將出現(xiàn)相同的區(qū)域。

應(yīng)用中也可以包含具有完全權(quán)限的系統(tǒng)級(jí)任務(wù)和ISR,允許它們?cè)L問(wèn)所有內(nèi)存、外設(shè)或CPU

當(dāng)違規(guī)發(fā)生時(shí),系統(tǒng)的行為取決于應(yīng)用程序,是哪個(gè)任務(wù)違規(guī)。例如,如果違規(guī)是由圖形用戶(hù)界面(GUI)造成的,可以終止并重新啟動(dòng)GUI,并且不會(huì)影響系統(tǒng)的其它部分。但是,如果違規(guī)任務(wù)控制一個(gè)制動(dòng)器,則異常處理程序可能需要在重啟任務(wù)之前立即停止制動(dòng)器。理想情況下,在產(chǎn)品開(kāi)發(fā)過(guò)程中會(huì)捕獲并糾正訪(fǎng)問(wèn)違規(guī),否則,系統(tǒng)設(shè)計(jì)人員將需要評(píng)估所有可能的結(jié)果,并決定發(fā)生這種情況時(shí)該做什么。

使用MPU檢測(cè)堆棧溢出

在基于RTOS的應(yīng)用中,每個(gè)任務(wù)都需要單獨(dú)的堆??臻g。堆棧溢出可能是基于RTOS的系統(tǒng)開(kāi)發(fā)人員所面臨的最常見(jiàn)的問(wèn)題之一。如果沒(méi)有硬件幫助,堆棧溢出檢測(cè)可以由軟件實(shí)現(xiàn),但軟件方式不能及時(shí)捕獲溢出,可能導(dǎo)致產(chǎn)品不穩(wěn)定。MPU可以幫助防止堆棧溢出。

如圖2所示,MPU域可用于堆棧溢出檢測(cè)。使用一個(gè)小的域(RedZone)來(lái)覆蓋每個(gè)任務(wù)堆棧的底部。配置MPU屬性,如果有任何代碼嘗試寫(xiě)入該區(qū)域,將觸發(fā)MPU異常。域的大小決定了該方法在捕獲堆棧溢出方面的效率。區(qū)域越大,堆棧溢出捕獲的可能性就越大,同時(shí)堆??捎玫?a href="http://srfitnesspt.com/tags/ram/" target="_blank">RAM就越少。

換言之,RedZone域被認(rèn)為是不可用的內(nèi)存,它被用來(lái)檢測(cè)非法寫(xiě)入。開(kāi)始時(shí)可以將RedZone大小設(shè)置為32個(gè)字節(jié),如果任務(wù)堆棧為512個(gè)字節(jié),那么32個(gè)字節(jié)約占用6%,剩余480個(gè)字節(jié)的可用堆??臻g。

83d71512-08b7-11ee-962d-dac502259ad0.png

圖2 使用MPU域檢測(cè)堆棧溢出

另一種檢測(cè)方法是將整個(gè)任務(wù)堆棧封裝為一個(gè)MPU區(qū)域,允許讀寫(xiě)操作。該方法有兩個(gè)問(wèn)題:首先,在Cortex-M(ARMv7M架構(gòu))上,堆棧的大小需為2的冪,并且必須在冪邊界(即32、64、128、256、512等)上對(duì)齊。如果嵌入式應(yīng)用有足夠的RAM,那么這不是問(wèn)題;然而,在資源受限的應(yīng)用 (如Cortex-M MCU)中,在減少浪費(fèi)的同時(shí)設(shè)置合適的堆棧內(nèi)存會(huì)很復(fù)雜。其次,該方法不允許寫(xiě)同一進(jìn)程中的其它任務(wù)堆棧,不允許進(jìn)程中的任務(wù)通過(guò)堆棧傳遞信息。

進(jìn)程表

進(jìn)程表中的條目數(shù)量取決于MPU。Cortex-M架構(gòu)MCU可以有8個(gè)或16個(gè)MPU區(qū)域。由于可用的區(qū)域數(shù)量有限,通常更多設(shè)置區(qū)域保護(hù)RAM中的數(shù)據(jù)訪(fǎng)問(wèn)。但是,如果應(yīng)用程序沒(méi)有用完所有區(qū)域,也可以通過(guò)區(qū)域限制對(duì)代碼的訪(fǎng)問(wèn)來(lái)提高安全性。

圖3展示了一個(gè)包含四個(gè)任務(wù)的進(jìn)程的區(qū)域定義,所有進(jìn)程將共享相同的Flash代碼空間。

840d3cbe-08b7-11ee-962d-dac502259ad0.png

圖3 一個(gè)擁有4個(gè)任務(wù)的進(jìn)程MPU域

1、一個(gè)MPU域提供對(duì)代碼空間的讀取和執(zhí)行訪(fǎng)問(wèn)。因?yàn)槌A客ǔ4鎯?chǔ)在Flash中(ASCII字符串、查找表、常量等),所以讀訪(fǎng)問(wèn)是必須的。

2、一個(gè)區(qū)域用于提供進(jìn)程相關(guān)的外設(shè)訪(fǎng)問(wèn),例如,以太網(wǎng)控制器、USB控制器等。MPU區(qū)域設(shè)置為讀寫(xiě)訪(fǎng)問(wèn),但不允許執(zhí)行代碼。如果進(jìn)程不需要訪(fǎng)問(wèn)外設(shè),則不需要此MPU區(qū)域。

3、一個(gè)MPU區(qū)域封裝進(jìn)程全局變量以及堆(heap)空間。MPU區(qū)域?qū)⒃O(shè)置為讀寫(xiě)權(quán)限,但同樣不允許執(zhí)行代碼。

4、一個(gè)MPU區(qū)域用于檢測(cè)堆棧溢出。此方法假設(shè)進(jìn)程中的任務(wù)不會(huì)通過(guò)其堆棧共享數(shù)據(jù)。同樣,在此區(qū)域中不允許執(zhí)行代碼。RTOS負(fù)責(zé)選擇運(yùn)行哪個(gè)任務(wù),相應(yīng)任務(wù)的堆棧將被封裝在MPU區(qū)域中。

5、該區(qū)域顯示了由于MPU區(qū)域大小和對(duì)齊限制而可能導(dǎo)致的RAM浪費(fèi)。資源受限的嵌入式應(yīng)用中應(yīng)嘗試盡量減少浪費(fèi)。

6、此MPU區(qū)域用于建立多個(gè)進(jìn)程共享的RAM。如果進(jìn)程不需要共享數(shù)據(jù),則不需要此MPU區(qū)域。

進(jìn)程表由“N”個(gè)條目組成,每個(gè)條目包含兩個(gè)字段:區(qū)域的基地址和指定區(qū)域?qū)傩裕▍^(qū)域大小,允許讀、寫(xiě)或執(zhí)行等)。

進(jìn)程表在創(chuàng)建任務(wù)時(shí)被分配給任務(wù)。RTOS只是在任務(wù)的控制塊(TCB)中保留一個(gè)指向進(jìn)程表的指針。RTOS在上下文切換時(shí)增加更新MPU進(jìn)程表的代碼,如圖4所示。在切換任務(wù)時(shí)不需要保存MPU配置。

84354c5e-08b7-11ee-962d-dac502259ad0.png

圖4 RTOS上下文切換時(shí),更新MPU配置

Cortex-M 特權(quán)等級(jí)

上電后,Cortex-M運(yùn)行在特權(quán)模式,可以訪(fǎng)問(wèn)CPU的所有資源,訪(fǎng)問(wèn)任何內(nèi)存或I/O地址,啟用/禁用中斷,設(shè)置嵌套向量中斷控制器(NVIC),配置FPU和MPU等。

為了保證系統(tǒng)的安全,特權(quán)模式代碼保留給經(jīng)過(guò)完全測(cè)試并受信任的代碼。由于大多數(shù)RTOS都經(jīng)過(guò)了完整的測(cè)試,通常被認(rèn)為是值得信任的,而應(yīng)用代碼是不可信的。也有例外,例如,只要ISR保持盡可能短而不被濫用,ISR通常被認(rèn)為是受信任的,因此也以特權(quán)模式運(yùn)行。這是大多數(shù)RTOS供應(yīng)商的建議。

應(yīng)用代碼在非特權(quán)模式下運(yùn)行,從而限制了代碼可以做的事情。具體來(lái)說(shuō),非特權(quán)模式可以防止代碼關(guān)中斷、更改嵌套向量中斷控制器(NVIC)的設(shè)置、將運(yùn)行模式更改為特權(quán)等級(jí)、修改MPU設(shè)置等。這是一個(gè)理想的特性,因?yàn)槲覀儾幌M皇苄湃蔚拇a賦予自己特權(quán),從而更改系統(tǒng)設(shè)計(jì)者提供的保護(hù)。

由于CPU總是以特權(quán)模式開(kāi)始運(yùn)行,任務(wù)需要從創(chuàng)建時(shí)就以非特權(quán)模式運(yùn)行,或者在啟動(dòng)后通過(guò)API調(diào)用,切換到非特權(quán)模式。一旦進(jìn)入非特權(quán)模式,CPU只有在中斷或異常服務(wù)中才能切換回特權(quán)模式。

在用戶(hù)模式訪(fǎng)問(wèn)RTOS服務(wù)

由于非特權(quán)代碼不能禁用中斷,因此應(yīng)用代碼被迫使用RTOS服務(wù)來(lái)訪(fǎng)問(wèn)共享資源。由于RTOS服務(wù)在特權(quán)模式下運(yùn)行,因此非特權(quán)任務(wù)必須通過(guò)Cortex-M提供的SVC機(jī)制切換回特權(quán)模式。SVC的行為類(lèi)似中斷,但由CPU指令觸發(fā)。

在Cortex-M上,SVC指令使用一個(gè)8位參數(shù)來(lái)指定256個(gè)可能的RTOS服務(wù)。設(shè)計(jì)者決定非特權(quán)代碼可以使用的RTOS服務(wù)。例如,你可能不希望允許非特權(quán)任務(wù)終止其它任務(wù)(或其本身)。此外,這些服務(wù)都不允許禁用中斷,因?yàn)檫@將破壞在非特權(quán)模式下運(yùn)行代碼的目的。一旦調(diào)用,SVC指令跳轉(zhuǎn)到SVC異常處理程序。

SVC處理過(guò)程如圖5所示。

圖5 用戶(hù)代碼調(diào)用RTOS服務(wù)

在Cortex-M3上,SVC處理程序?qū)⒃黾蛹s1k字節(jié)的代碼,需要執(zhí)行75~125條CPU指令。因此,相同RTOS服務(wù),在非特權(quán)代碼中調(diào)用比特權(quán)模式調(diào)用需要更多的處理時(shí)間。

在非特權(quán)模式下運(yùn)行代碼還可以防止用戶(hù)代碼禁用中斷,從而減少了鎖定系統(tǒng)的機(jī)會(huì)。當(dāng)然,如果用戶(hù)代碼進(jìn)入無(wú)限循環(huán),特別是在高優(yōu)先級(jí)任務(wù)或ISR中時(shí),鎖定仍然可能發(fā)生。在這種情況下,通過(guò)使用看門(mén)狗可以恢復(fù)。

進(jìn)程間通信

圖6展示了進(jìn)程之間的通信方式。這些只是一些可能的場(chǎng)景,實(shí)際上,應(yīng)用程序可以使用這些技術(shù)的組合。

84641318-08b7-11ee-962d-dac502259ad0.png

圖6 進(jìn)程通信方式

1、互斥量用于確保兩個(gè)進(jìn)程不同時(shí)訪(fǎng)問(wèn)相同的數(shù)據(jù)。注意,互斥量駐留在RTOS內(nèi)存空間中,通過(guò)RTOS API,所有進(jìn)程可以訪(fǎng)問(wèn)該互斥量。

2、需要訪(fǎng)問(wèn)受保護(hù)資源的任務(wù)必須首先獲取互斥量。當(dāng)任務(wù)完成共享資源訪(fǎng)問(wèn)后,互斥量將被釋放。沙漏表示可選超時(shí),當(dāng)任務(wù)不希望永久等待所有者釋放互斥量時(shí),可以使用超時(shí)機(jī)制。

3、信號(hào)量也可以用來(lái)指示數(shù)據(jù)可用。

4、進(jìn)程中的任務(wù)將數(shù)據(jù)存儲(chǔ)到共享內(nèi)存中,然后發(fā)出信號(hào)。

5、進(jìn)程B中的任務(wù)等待進(jìn)程A的信號(hào)。沙漏表示一個(gè)可選的超時(shí),以避免永遠(yuǎn)等待信號(hào)。如果該信號(hào)未在規(guī)定的時(shí)間內(nèi)發(fā)生,則RTOS將恢復(fù)該任務(wù)。在這種情況下,任務(wù)知道共享區(qū)域中沒(méi)有存入任何東西。

6、如果沒(méi)有發(fā)生超時(shí),進(jìn)程B確認(rèn)數(shù)據(jù)處理完成。

7、進(jìn)程A發(fā)信號(hào)量后,等待具有可選超時(shí)的確認(rèn)。

8、通信也可以使用RTOS的消息隊(duì)列機(jī)制。此時(shí),從共享RAM區(qū)域動(dòng)態(tài)分配緩沖區(qū),進(jìn)程A中的發(fā)送任務(wù)填充緩沖區(qū),并將指針發(fā)送給進(jìn)程B中的任務(wù)。

9、與信號(hào)量情況類(lèi)似,等待進(jìn)程B中的任務(wù)確認(rèn),并指定一個(gè)可選的超時(shí)。

內(nèi)存和I/O訪(fǎng)問(wèn)錯(cuò)誤處理

進(jìn)程間可以通過(guò)共享內(nèi)存進(jìn)行通信,兩個(gè)進(jìn)程的MPU配置表中將出現(xiàn)相同的區(qū)域。

應(yīng)用中也可以包含具有完全權(quán)限的系統(tǒng)級(jí)任務(wù)和ISR,允許它們?cè)L問(wèn)所有內(nèi)存、外設(shè)或CPU。

當(dāng)違規(guī)發(fā)生時(shí),系統(tǒng)的行為取決于應(yīng)用程序,是哪個(gè)任務(wù)違規(guī)。例如,如果違規(guī)是由圖形用戶(hù)界面(GUI)造成的,可以終止并重新啟動(dòng)GUI,并且不會(huì)影響系統(tǒng)的其它部分。但是,如果違規(guī)任務(wù)控制一個(gè)制動(dòng)器,則異常處理程序可能需要在重啟任務(wù)之前立即停止制動(dòng)器。理想情況下,在產(chǎn)品開(kāi)發(fā)過(guò)程中會(huì)捕獲并糾正訪(fǎng)問(wèn)違規(guī),否則,系統(tǒng)設(shè)計(jì)人員將需要評(píng)估所有可能的結(jié)果,并決定發(fā)生這種情況時(shí)該做什么。

MPU的工作是確保進(jìn)程中的任務(wù)只能訪(fǎng)問(wèn)分配給它的內(nèi)存和外設(shè)。但是,如果任務(wù)試圖訪(fǎng)問(wèn)允許區(qū)域以外的數(shù)據(jù)呢?MPU會(huì)觸發(fā)一個(gè)稱(chēng)為內(nèi)存管理(MemManage)故障的CPU異常。

當(dāng)故障發(fā)生時(shí),系統(tǒng)行為取決于應(yīng)用程序,但如何處理故障可能是很難確定的事情。首先,這些類(lèi)型的故障應(yīng)該在開(kāi)發(fā)過(guò)程中被檢測(cè)和糾正。然而,使用MPU的原因之一是為了防止發(fā)生的無(wú)效內(nèi)存或外設(shè)訪(fǎng)問(wèn),要么是因?yàn)橄到y(tǒng)驗(yàn)證期間未捕獲某些偶發(fā)情況,或者是未經(jīng)授權(quán)的訪(fǎng)問(wèn)。

MemManage故障通常由RTOS處理。理想情況下,嵌入式系統(tǒng)有一些機(jī)制可以記錄和報(bào)告故障,以便在產(chǎn)品的下一個(gè)版本中修正。文件系統(tǒng)是記錄這些故障的好地方,當(dāng)然,還取決于故障處理程序。

發(fā)生故障時(shí),故障處理程序可以執(zhí)行以下操作序列(偽代碼):

void OS_MPU_FaultHandler (void)
{
// Terminate the offending task/process                     (1)
// Release resources owned by the task/process          (2)
// Run a user provided ‘callback’ (based on the offending task)                                                                                (3)
// If we have a file system:                                        (4)
// Store information about the cause
// Do we restart the task/process?                             (5)
// Yes, Restart the task/process
// Alert a user                                                         (6)
// No, Reset the system                                           (7)
}

(1)當(dāng)故障發(fā)生時(shí),設(shè)計(jì)者需要確定如何操作。至少必須終止違規(guī)的任務(wù),但我們是否還需要終止此進(jìn)程中的其他任務(wù)?沒(méi)有一個(gè)確定的答案,事實(shí)上,這可能取決于是哪個(gè)任務(wù)造成了故障。因此,MPU故障處理程序應(yīng)根據(jù)觸發(fā)它的任務(wù)或進(jìn)程執(zhí)行不同的操作。

(2)被終止的違規(guī)任務(wù)(或進(jìn)程)可能擁有內(nèi)核對(duì)象、緩沖區(qū)、I/O等資源。這些資源需要被釋放,以避免影響其他任務(wù)/進(jìn)程。

(3)導(dǎo)致故障的任務(wù)可能會(huì)控制制動(dòng)器或其他類(lèi)型的輸出,需將任務(wù)置于安全狀態(tài),以避免對(duì)人員或資產(chǎn)造成傷害。嵌入式系統(tǒng)設(shè)計(jì)者應(yīng)提供用戶(hù)定義的回調(diào)函數(shù),以處理系統(tǒng)特定的操作。在任務(wù)創(chuàng)建過(guò)程中,將回調(diào)函數(shù)存儲(chǔ)在任務(wù)的控制塊(TCB)中。為提高系統(tǒng)安全性,只能在系統(tǒng)啟動(dòng)時(shí)創(chuàng)建任務(wù),此時(shí)CPU處于特權(quán)模式;運(yùn)行時(shí)只能在故障時(shí)刪除任務(wù)。由于TCB位于RTOS空間中,因此無(wú)法從用戶(hù)代碼訪(fǎng)問(wèn)回調(diào)函數(shù),從而防止?jié)撛诘牟话踩筒豢煽康拇a無(wú)意中或惡意地調(diào)用回調(diào)函數(shù)。

(4)如果嵌入式系統(tǒng)具有數(shù)據(jù)存儲(chǔ)功能,則可以記錄故障相關(guān)的信息,如違規(guī)任務(wù)的性質(zhì)、CPU寄存器的值、所采取的操作等。

(5)根據(jù)導(dǎo)致故障的任務(wù),可以重新啟動(dòng),使系統(tǒng)可以錯(cuò)誤中恢復(fù)。

(6)如果系統(tǒng)能夠恢復(fù),并且如果系統(tǒng)包含顯示,則警告提示非常有用。此外,如果系統(tǒng)具有網(wǎng)絡(luò)連接,則通知服務(wù)部門(mén)和開(kāi)發(fā)團(tuán)隊(duì)可以在將來(lái)的版本中避免此問(wèn)題。

(7)如果系統(tǒng)無(wú)法恢復(fù),除了重置系統(tǒng)之外,可能沒(méi)有其他選擇。

可以更改MPU進(jìn)程表,使其包含每個(gè)任務(wù)的回調(diào)函數(shù),以便檢測(cè)到故障時(shí)從RTOS上下文切換代碼調(diào)用。如果所有的任務(wù)都需要對(duì)故障執(zhí)行相同的操作,那么可以不使用此功能,或者讓所有MPU進(jìn)程表都指向相同的回調(diào)函數(shù)。后一種選擇更最靈活,因?yàn)樗鼮槲磥?lái)的版本提供了更大的靈活性。但你可能需要咨詢(xún)RTOS供應(yīng)商,以確定此功能是否可用。

建議

以非特權(quán)模式運(yùn)行用戶(hù)代碼

使用MPU時(shí),以特權(quán)模式運(yùn)行應(yīng)用代碼。這意味著應(yīng)用程序代碼將能夠更改MPU設(shè)置,并破壞使用MPU的目的。以特權(quán)模式運(yùn)行應(yīng)用可能更容易地遷移應(yīng)用代碼。在某些時(shí)候,大多數(shù)應(yīng)用程序代碼將需要在非特權(quán)模式下運(yùn)行,用戶(hù)需要添加SVC處理程序。

ISR具有完全訪(fǎng)問(wèn)權(quán)限

當(dāng)識(shí)別到中斷并且啟動(dòng)ISR時(shí),處理器將切換到特權(quán)模式。由于MPU控制寄存器的PRIVDEFENA為1,因此ISR可以訪(fǎng)問(wèn)所有I/O內(nèi)存。

此外,ISR應(yīng)該盡可能短,并簡(jiǎn)單地發(fā)信號(hào)給任務(wù),由任務(wù)執(zhí)行中斷設(shè)備所需的大部分工作。當(dāng)然,這假設(shè)ISR是內(nèi)核感知的ISR,并且該中斷設(shè)備有相當(dāng)多的工作處理。例如,不應(yīng)在ISR中上處理以太網(wǎng)數(shù)據(jù)包。然而,閃爍LED或更新脈沖寬度調(diào)制(PWM)計(jì)時(shí)器的占空比可以直接在ISR中完成。

防止在RAM中執(zhí)行代碼

大多數(shù)MPU可以防止從RAM執(zhí)行代碼,從而限制代碼注入攻擊。防止外設(shè)執(zhí)行代碼可能看起來(lái)很奇怪,但可以防止想方設(shè)法進(jìn)入系統(tǒng)的黑客

限制進(jìn)程對(duì)外設(shè)的訪(fǎng)問(wèn)

應(yīng)該留出一個(gè)或多個(gè)MPU區(qū)域,以限制進(jìn)程只能訪(fǎng)問(wèn)自己的外設(shè)。換言之,如果一個(gè)進(jìn)程管理USB端口,那么它應(yīng)該只能訪(fǎng)問(wèn)USB外設(shè)或與USB控制器的需求相關(guān)的外設(shè),例如DMA。

限制可用的RTOS API

設(shè)計(jì)者必須確定應(yīng)用代碼可使用哪些RTOS API。例如,是否禁止應(yīng)用代碼在系統(tǒng)初始化后創(chuàng)建和刪除任務(wù)或RTOS對(duì)象?換言之,RTOS對(duì)象是否只能系統(tǒng)啟動(dòng)時(shí)創(chuàng)建,而非運(yùn)行時(shí)創(chuàng)建?如果是,SVC處理程序查找表應(yīng)只包含向應(yīng)用公開(kāi)的API。即使ISR在特權(quán)模式下運(yùn)行,可以訪(fǎng)問(wèn)所有的RTOS API,一個(gè)好的RTOS也會(huì)阻止從ISR中創(chuàng)建和刪除RTOS對(duì)象。

在RTOS空間中分配RTOS對(duì)象

任務(wù)堆棧位于進(jìn)程空間內(nèi),但是,RTOS對(duì)象(信號(hào)量、隊(duì)列、任務(wù)控制塊等)應(yīng)在內(nèi)核空間中分配,并通過(guò)引用進(jìn)行訪(fǎng)問(wèn)。不應(yīng)在進(jìn)程空間中分配RTOS對(duì)象,因?yàn)檫@意味著應(yīng)用代碼可以不調(diào)用RTOS API,即可有意或意外地修改內(nèi)核對(duì)象。

保護(hù)對(duì)代碼的訪(fǎng)問(wèn)

雖然MPU區(qū)域通常用于提供或限制對(duì)RAM和外設(shè)的訪(fǎng)問(wèn),但如果有空閑區(qū)域,并且能夠通過(guò)進(jìn)程組織代碼,那么限制對(duì)代碼的訪(fǎng)問(wèn)非常有用,可以防止某些類(lèi)型的安全攻擊,如Return-to-libc攻擊。

減少進(jìn)程間的通信

正如設(shè)計(jì)時(shí),盡可能保持任務(wù)獨(dú)立一樣,進(jìn)程也應(yīng)該遵循同樣的規(guī)則。因此,進(jìn)程間應(yīng)盡量不交互,或者將進(jìn)程間通信保持在最低限度。如果必須與其它進(jìn)程通信,只需留出一個(gè)包含Out和In緩沖區(qū)的共享區(qū)域。發(fā)送者將其數(shù)據(jù)放入Out緩沖區(qū)中,然后觸發(fā)一個(gè)中斷來(lái)喚醒接收進(jìn)程。一旦數(shù)據(jù)被處理,響應(yīng)可以放在發(fā)送者的In緩沖區(qū)中,并且可以使用中斷來(lái)通知發(fā)送進(jìn)程。

確定出現(xiàn)MPU故障時(shí)應(yīng)如何操作

理想情況下,在開(kāi)發(fā)過(guò)程中檢測(cè)并糾正所有MPU故障。你還需考慮由于意外故障或錯(cuò)誤或系統(tǒng)受到安全攻擊而出現(xiàn)的故障處理。在大多數(shù)情況下,建議對(duì)每個(gè)任務(wù)或每個(gè)進(jìn)程設(shè)置一個(gè)可控的關(guān)機(jī)順序。是否重新啟動(dòng)違規(guī)任務(wù)、進(jìn)程內(nèi)或整個(gè)系統(tǒng)內(nèi)的所有任務(wù)都取決于故障的嚴(yán)重程度。

記錄和報(bào)告故障

理想情況下,系統(tǒng)應(yīng)該能夠記錄(可能是文件系統(tǒng))并顯示故障原因,以便開(kāi)發(fā)人員解決問(wèn)題。


大多數(shù)RTOS在特權(quán)模式下運(yùn)行應(yīng)用代碼,使得應(yīng)用程序完全控制CPU及其資源。所有任務(wù)和ISR都可以不受限制地訪(fǎng)問(wèn)內(nèi)存和外設(shè)。這意味著應(yīng)用程序代碼可能會(huì)意外或故意損壞其他任務(wù)的堆?;蜃兞?。通過(guò)MPU機(jī)制,可以限制應(yīng)用代碼的訪(fǎng)問(wèn)權(quán)限,極大提供應(yīng)用的功能安全。




審核編輯:劉清

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

    關(guān)注

    146

    文章

    16792

    瀏覽量

    349319
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9005

    瀏覽量

    366020
  • MPU
    MPU
    +關(guān)注

    關(guān)注

    0

    文章

    334

    瀏覽量

    48659
  • Flash控制器
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    8050
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    227

    瀏覽量

    29690

原文標(biāo)題:MPU在哪些方面保護(hù)內(nèi)存安全?

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AUTOSAR內(nèi)存分區(qū)和MPU關(guān)系簡(jiǎn)述

    MPU保護(hù)與當(dāng)前執(zhí)行的代碼“不相關(guān)“的所有數(shù)據(jù)。
    的頭像 發(fā)表于 03-18 11:15 ?1059次閱讀
    AUTOSAR<b class='flag-5'>內(nèi)存</b>分區(qū)和<b class='flag-5'>MPU</b>關(guān)系簡(jiǎn)述

    如何管理STM32產(chǎn)品中的內(nèi)存保護(hù)單元(MPU

    本應(yīng)用筆記介紹如何管理 STM32 產(chǎn)品中的內(nèi)存保護(hù)單元(MPU)。MPU 是用于存儲(chǔ)器保護(hù)的可選組件。STM32 微控制器(MCU)中嵌入 MPU
    發(fā)表于 09-07 06:23

    MPU是什么Cortex-M內(nèi)核的MPU內(nèi)存保護(hù)單元詳細(xì)講解

    估計(jì)大家經(jīng)??匆?jiàn)MCU、MPU、MMU等這類(lèi)縮寫(xiě)詞,你們了解MPU嗎?
    的頭像 發(fā)表于 02-03 09:30 ?1.1w次閱讀

    Cortex-M內(nèi)核的MPU內(nèi)存保護(hù)單元

    講講Cortex-M內(nèi)核的MPU內(nèi)存保護(hù)單元
    的頭像 發(fā)表于 03-04 11:17 ?3554次閱讀
    Cortex-M內(nèi)核的<b class='flag-5'>MPU</b><b class='flag-5'>內(nèi)存保護(hù)</b>單元

    基于A(yíng)RM Cortex-M MCU中的MPU所提供的一些特性

    內(nèi)存保護(hù)單元(MPU)是一種硬件機(jī)制,通過(guò)只允許代碼訪(fǎng)問(wèn)需要的內(nèi)存和外設(shè)來(lái)提高嵌入式設(shè)備的安全性。應(yīng)用程序可以組織為進(jìn)程(process),每個(gè)進(jìn)程訪(fǎng)問(wèn)自己的
    的頭像 發(fā)表于 07-19 09:47 ?7228次閱讀

    MPU和MMU、MPU和MCU的區(qū)別

    一、MMU vs MPU內(nèi)存是現(xiàn)代計(jì)算機(jī)最重要的組件之一。因此,它的內(nèi)容不能被任何錯(cuò)誤的應(yīng)用所篡改。這個(gè)功能可以通過(guò)MMU(Memory Management Unit)或者MPU(Memory
    發(fā)表于 10-26 16:36 ?4次下載
    <b class='flag-5'>MPU</b>和MMU、<b class='flag-5'>MPU</b>和MCU的區(qū)別

    Cortex-M內(nèi)核的MPU內(nèi)存保護(hù)單元

    的選配件,拿STM32F1來(lái)說(shuō),STM32F10X_XL系列的芯片才具有這個(gè)MPU存儲(chǔ)保護(hù)單元,而其他STM32F1芯片沒(méi)有??赡芎芏嗳硕继幱诤?jiǎn)單知道,或認(rèn)識(shí)MPU的階段,今天就寫(xiě)點(diǎn)關(guān)...
    發(fā)表于 12-01 12:21 ?9次下載
    Cortex-M內(nèi)核的<b class='flag-5'>MPU</b><b class='flag-5'>內(nèi)存保護(hù)</b>單元

    STM32H7-MPU的理解和配置

    STM32H7-MPU一、MPU的作用防止不受信用的應(yīng)用程序訪(fǎng)問(wèn)受保護(hù)內(nèi)存區(qū)域防止用戶(hù)應(yīng)用程序破壞操作系統(tǒng)使用的數(shù)據(jù)通過(guò)阻止任務(wù)訪(fǎng)問(wèn)其他任務(wù)的數(shù)據(jù)區(qū)允許將
    發(fā)表于 12-28 20:06 ?1次下載
    STM32H7-<b class='flag-5'>MPU</b>的理解和配置

    為什么要使用MPU?MPU如何實(shí)現(xiàn)內(nèi)存保護(hù)?

    如果你開(kāi)發(fā)的嵌入式項(xiàng)目,因內(nèi)存溢出,或者內(nèi)存故障等一些原因,造成了重大經(jīng)濟(jì)損失,或者造成了重大事故,你就能體會(huì)為什么要使用內(nèi)存保護(hù)單元(MPU)了。
    的頭像 發(fā)表于 07-05 17:38 ?6594次閱讀
    為什么要使用<b class='flag-5'>MPU</b>?<b class='flag-5'>MPU</b>如何實(shí)現(xiàn)<b class='flag-5'>內(nèi)存保護(hù)</b>?

    如何管理STM32產(chǎn)品中的MPU

    本應(yīng)用說(shuō)明介紹了如何管理STM32產(chǎn)品中的MPU,它是一個(gè)內(nèi)存保護(hù)的可選組件。包括STM32中的MPU微控制器使它們更加健壯可靠。必須對(duì)MPU進(jìn)行編程,并且在使用之前啟用。如果
    發(fā)表于 09-28 10:40 ?0次下載

    AN5612 STM32 MCU和MPU的ESD保護(hù)

    AN5612 STM32 MCU和MPU的ESD保護(hù)
    發(fā)表于 11-21 17:07 ?0次下載
    AN5612 STM32 MCU和<b class='flag-5'>MPU</b>的ESD<b class='flag-5'>保護(hù)</b>

    AN5261 STM32 MCU和MPU的ESD保護(hù)

    AN5261 STM32 MCU和MPU的ESD保護(hù)
    發(fā)表于 11-21 17:07 ?0次下載
    AN5261 STM32 MCU和<b class='flag-5'>MPU</b>的ESD<b class='flag-5'>保護(hù)</b>

    為什么要使用MPU?MPU如何實(shí)現(xiàn)內(nèi)存保護(hù)?

    如果你開(kāi)發(fā)的嵌入式項(xiàng)目,因內(nèi)存溢出,或者內(nèi)存故障等一些原因,造成了重大經(jīng)濟(jì)損失,或者造成了重大事故,你就能體會(huì)為什么要使用內(nèi)存保護(hù)單元(MPU)了。
    的頭像 發(fā)表于 02-24 11:59 ?2549次閱讀

    MPU是什么 MPU的功能

    MPU(Memory Protection Unit)是一種硬件保護(hù)機(jī)制,用于保護(hù)嵌入式系統(tǒng)中的內(nèi)存安全。它是嵌入式處理器中的一種特殊模塊,
    的頭像 發(fā)表于 06-12 17:43 ?1.5w次閱讀

    如何管理STM32產(chǎn)品中的內(nèi)存保護(hù)單元(MPU)

    電子發(fā)燒友網(wǎng)站提供《如何管理STM32產(chǎn)品中的內(nèi)存保護(hù)單元(MPU).pdf》資料免費(fèi)下載
    發(fā)表于 08-01 09:15 ?0次下載
    如何管理STM32產(chǎn)品中的<b class='flag-5'>內(nèi)存保護(hù)</b>單元(<b class='flag-5'>MPU</b>)