1

多くの人が、シャットダウン時に RAM を消去するのはかなり無意味だと考えていることを知っています。私は、利点と欠点についてかなりの調査を行いました (そして、それが本当に価値があるかどうか)。ですから、可能な限り丁寧な方法で...「なぜラムを拭きたいのですか、それは無意味です」などのコメントはやめてください。

DD /dev/mem を試みたところ、予想どおり DD がエラーをスローし、カーネルは DD が 101000 から 101200 の間のメモリにアクセスしようとしたことを警告しました。したがって、私の質問は... Linux でメモリがどのように割り当てられているか、より正確には、個人情報はアドレス 101000 と 101200 の間に存在しますか、それともカーネル用に完全に予約/保護されていますか?

前もって感謝します

トム

4

2 に答える 2

3

詳細を提供していないため、x86 で実行されている最新のカーネル バージョンを使用していると想定しています。

Linux のドキュメントには、起動後の物理メモリ レイアウトが記載されています。カーネルがアドレス 0x100000 にロードされていることがわかります。つまり、質問している領域 (0x101000 - 0x101200) にはカーネル コードしかありません。

物理メモリは、バイナリ バディ アロケータを使用してページに割り当てられます。詳細については、こちらを参照してください。

ただし、カーネル コード以外を使用して物理メモリを消去することは不可能であり、危険な場合があります (ディスク上のデータの破損)。本当にシャットダウン時に RAM を消去したい場合は、カーネルをハッキングすることをお勧めします。

于 2012-03-06T17:02:08.753 に答える
0

物理メモリをできる限り消去するには(あなたが言及したので、ユーザーランド ソリューションについて話しているのです!)、インストールされている RAM 1ddと同じサイズの匿名マッピングを作成し、次のように記述してすべてのページにアクセスするだけで十分です。各ページ内の1つのアドレスに1バイト(またはその他の量)。

これにより、ページ フォールトが発生し、タッチするマッピング内のすべてのページのゼロ ページでコピー オン ライト操作がトリガーされます。これにより、既にゼロになっているページがコミットされるか、メモリの未使用のゼロになっていない物理ページがゼロになります。何も残らなくなるまで、その時点でプロセスは OOM キラーによって強制終了されます (または、どちらがSIGBUSプロセスを最初にヒットしたかに応じて、 を受け取ります)。
ある程度「クリーン」にしたい場合 (つまり、OOM キラーを使用しない場合)、最後のページに触れる前に停止する必要があることは明らかです。しかし、一般的には、これで十分です。

このようにすべての物理ページを消去することはできませんが、実際にはユーザー プロセスでそれを行う方法はありません (スワップなしではなく、決定論的な方法でもありません)。他のプロセスによってコミットされたページまたはカーネルに属するページは、少なくとも確実ではありませんが、このアプローチでは上書きできません(スワップがないため、運が良ければ OOM があるかもしれませんが、これらはスワップアウトできません)。自分のプロセスではなく他のプロセスを強制終了します)。
一般に、実行中のカーネルを置き換えない限り、100% 信頼できる方法で物理メモリを上書きすることはできません。

超「徹底」したい場合、唯一の選択肢は、カーネルモードから呼び出すmemtest_x86などにあるコードを記述し、実行中のカーネルを置き換えて生の物理メモリを「難しい方法」で上書きすることです。 memtest_x86 も同様です。

しかし、極度のパラノイア ルートに進む場合は、GPU メモリをクリアし、ハードディスク キャッシュとネットワーク カード メモリも消去することを忘れないでください...


1実際には、最大コミット サイズのサイズのマッピングを作成する必要がありますが、スワップはないと述べたので、「RAM のサイズ」で十分です。最新のディスク ドライブがどのように広範なウェア レベリングを行っているかを確認すると、スワップを上書きしてもあまり役に立ちませんが、少なくとも最大コミット サイズまでコミットすれば、すべての RAM ページにヒットしていることを保証できます。

于 2014-02-16T14:11:09.077 に答える