2011-08-28 89 views
6

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

我想知道這個的原因是因爲我正在使用沒有任何內存保護的專有manycore平臺。現在我的問題是,軟件是否可以用來保護內存,特別是由於軟錯誤(而不是程序員的錯誤)造成的野性寫入。任何幫助,將非常感激。

+0

Wound't valgrind做你需要的嗎? –

+0

我不需要它來進行調試,但是避免了在運行時出現亂碼的情況。基本上我想要一個安全可靠的系統。 – MetallicPriest

回答

5

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

使用軟件,您可以實施驗證/檢測方案。您可以定期檢查當前正在運行的程序不應該訪問的內存部分,並查看它們是否已更改(可能通過對這些區域進行CRC校驗)。但是,當然如果流氓程序破壞了校驗和的區域,或者檢查程序的代碼被保留,那麼所有的投注都關閉。

即使這個軟件檢查解決方案比永久運行時保護更像是一個調試工具。沒有MMU的設備很可能是一個小型嵌入式設備,它不會經常檢查設備內存的備用週期。

通常沒有MMU的設備被設計爲運行一個沒有內核或其他任何程序的程序,因此沒有任何保護措施。如果您需要運行多個程序並且覺得需要保護,那麼您可能需要一個更先進的硬件來支持您正在尋找的功能。

+1

如果內存保護可以用硬件來實現,那麼推測可以用軟件來實現。 –

+1

@大衛:當然,通過模擬硬件。那時它只是一個虛擬機器。然後,實際硬件的速度開始發揮作用。據推測,這傢伙對實施他自己的VM並不感興趣,因爲那會很瘋狂。 – SoapBox

+1

我同意所有這一切。我只是對你說,硬件是唯一的方法。也許你可以說硬件是唯一現實的或理智的方式。就這樣! –

2

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

+0

什麼樣的支持。我的意思是,這個機制是什麼? – MetallicPriest

+3

編譯器通常會在每次訪問內存時寫入一條簡單的讀或寫指令。但是,您需要將每條這樣的指令替換爲對執行您正在查找的運行時保護的庫函數的調用。 –

+0

...如果你想要達到這個極限,你不妨將程序移植到例如Python或Lua並完成它。你會獲得更好的表現和可能的類似的穩定性。 –

0

取決於將運行的應用程序平臺。有一種稱爲類型安全語言(例如ATS)的技術,可以防止軟件錯誤。而這樣的語言可能會有很好的表現(例如ATS)。

1

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

內存由內核代碼管理。整個內存(堆)被分成不同大小的堆列表(堆列表的大小可以是4個字節,8個字節,16個字節,最多1024個字節),並且每個堆塊都有一個標題,該特定的堆塊是否被佔用。所以,當你需要分配一個新的堆塊時,你可以瀏覽堆列表並查看哪些堆塊是空閒的,並可以將它們分配給請求的應用程序。當釋放一個特定大小的堆塊時,情況也是如此,該塊的頭部會被更新以反映它已被釋放。

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

實現比看起來簡單得多。