2012-03-06 51 views
0

我知道很多人認爲在關機時擦拭內存是毫無意義的,我已經對優點和缺點進行了一些研究(如果它確實值得的話)。因此,在最好的禮貌可能的方式...請沒有評論,如「爲什麼你想擦拭Ram,其毫無意義」關機前擦除RAM,Linux如何分配內存?

我試圖DD/dev/mem和預期DD拋出一個錯誤和內核警告DD試圖訪問101000和101200之間的內存。所以我的問題是......在Linux中如何分配內存,更確切地說,地址101000和101200之間是否存在任何個人信息,或者它是否完全保留用於內核?

在此先感謝

湯姆

+0

那麼,RAM只是易失性的,所以系統關閉後無需擔心。 但是,交換分區/文件可能仍包含一些信息,具體取決於您的系統配置。 – 0xC0000022L 2012-03-06 16:25:31

+0

對不起,我應該補充說我正在運行一個定製的實時分發,所以沒有交換空間。 – Xleedos 2012-03-06 16:31:17

+0

那麼有什麼擔心?你爲什麼要擦拭RAM?確保機器的電源關閉時間超過10s,並且應該是安全的。 – 0xC0000022L 2012-03-06 16:35:02

回答

3

既然你沒有提供任何細節我假設你使用的是相當近期的內核版本x86上運行。

Linux documentation提供引導後的物理內存佈局。你可以在那裏看到內核被加載到地址0x100000。這意味着在你詢問的區域(0x101000 - 0x101200)只有內核代碼。

使用二進制夥伴分配器在頁面中分配物理內存。它在更詳細的描述here

但是,使用除內核代碼之外的任何內容擦除物理內存是不可能的,並且可能是危險的(磁盤上的數據損壞)。如果你真的想在關機時擦拭RAM,我會建議黑客入侵內核。

+0

寫了(關於擦除危險)已在評論中,但爲鏈接+1。謝謝。 – 0xC0000022L 2012-03-06 17:11:13

0

爲了消滅物理內存(你提到dd所以我們正在談論的是用戶級的解決方案!)充分發揮自己的能力,就足以創造一個匿名映射相同大小的安裝RAM 並通過向每個頁面內的一個地址寫入單個字節(或任何其他量)來觸摸每個頁面。

這將導致頁面錯誤並觸發寫入時複製操作,在零頁上爲您觸摸的映射中的每個頁面執行寫入時複製操作,該操作將提交已歸零的頁面或歸零未使用的非歸零物理頁面的內存 - 直到沒有剩下的時間,此時你的進程將被OOM殺手所殺(或者將會收到SIGBUS,這取決於哪一個會首先觸發你的進程)。
如果你希望它有些「更清潔」(即沒有OOM殺手),你需要在觸摸最後一頁之前停下來,顯然。但總的來說,這是所需要的。

能夠消滅所有類似的物理頁,但真的是沒有這樣做的方式與用戶進程(不是沒有掉,而不是在一個確定性方式)。 屬於內核的其他進程或頁面提交的頁面不能被這種方法覆蓋,至少不能被可靠地(因爲沒有交換,這些不能被交換出去,儘管你可能是幸運的並讓OOM殺死其他進程而不是你)。
除非您替換正在運行的內核,否則通常無法以100%可靠的方式覆蓋物理內存。

如果你想超級「徹底」,那麼你唯一的選擇是編寫代碼,因爲它可以找到例如,在您從內核模式調用的memtest_x86中,替換正在運行的內核,並以「hard way」覆蓋原始物理內存,就像memtest_x86一樣。

不過,如果你去的超偏執的路線,不要忘記清除GPU內存和擦拭硬盤緩存和網卡內存以及...


其實,你會必須創建一個最大提交大小的映射 - 但你表示沒有交換,所以「RAM的大小」將做。看到現代磁盤驅動器如何進行大量的磨損平衡,無論如何,覆蓋交換不會有太大的幫助,但至少可以保證,如果您承諾達到最大提交大小,則會觸及所有RAM頁面。