簡體   English   中英

沒有MMU的內存保護

[英]Memory Protection without MMU

我想知道如何在沒有MMU支持的情況下保護內存。 我試圖谷歌它,但沒有看到任何有價值的論文或研究。 那些處理它的只會處理bug,例如未初始化的指針,而不是由於軟錯誤引起的內存損壞,也就是說,由於硬件瞬態故障破壞了寫入內存位置的指令。

我想知道這個的原因是因為我正在開發一個沒有任何內存保護的專有多核平台。 現在我的問題是,軟件可以用來保護內存,特別是由於軟錯誤導致的瘋狂寫入(而不是程序員的錯誤)。 任何有關這方面的幫助將非常感激。

如果您正在尋找運行時內存保護,那么理智的選擇就是硬件支持。 硬件是在可能導致損壞之前干預壞內存訪問的唯一方法。 任何軟件解決方案都容易受到它試圖防范的內存錯誤的影響。

使用軟件,您可以實施驗證/檢測方案。 您可以定期檢查當前正在運行的程序無法訪問的內存部分,看看它們是否已更改(可能是通過CRC這些區域)。 但當然,如果流氓程序損壞了校驗和所在的區域,或者核查程序的代碼被保留,那么所有的賭注都將被取消。

即使這種軟件檢查解決方案也不僅僅是一個調試工具,而是一個永久運行時保護。 沒有MMU的設備可能是一個小型嵌入式設備,它不會有備用周期來不斷檢查設備的內存。

通常沒有MMU的設備被設計為運行沒有內核或其他任何東西的單個程序,因此沒有什么可以保護的。 如果您需要運行多個程序並感覺需要保護,則可能需要更高級的硬件來支持您正在尋找的功能。

如果您希望軟件實現內存保護,那么您將需要編譯器及其相關庫的支持。 我希望在這個平台上只有一個編譯器,所以你應該聯系供應商。 我不會對積極回應抱太大希望。 即使他們有這樣的工具,我也希望軟件內存保護的性能是不可接受的。

多個MMU系統存在於多個嵌入式解決方案中。

內存由內核代碼管理。 整個內存(堆)被分成各種大小的堆列表(堆列表可以是4字節,8字節,16字節......最多1024字節)並且每個堆塊附加一個標頭,告訴是否是否采用特定的堆塊。 因此,當您需要分配新的堆塊時,您可以瀏覽堆列表並查看哪些堆塊是空閑的,並可以將它們分配給請求的應用程序。 當您釋放特定大小的堆塊時,情況也是如此,該塊的標頭會更新以反映它已被釋放。

現在,當應用程序請求特定大小的堆塊並且堆列表的大小已滿時,此實現必須處理這種情況。 在這種情況下,您將從下一個堆列表大小中拆分一個塊,或者將較小的堆塊連接在一起並添加到請求大小的堆列表中。

實現比看起來簡單得多。

取決於將運行的應用程序平台。 有一種稱為類型安全語言(例如ATS)的技術可以防止軟件錯誤。 這些語言可能具有良好的性能(例如,ATS)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM