物理メモリをできる限り消去するには(あなたが言及したので、ユーザーランド ソリューションについて話しているのです!)、インストールされている RAM 1dd
と同じサイズの匿名マッピングを作成し、次のように記述してすべてのページにアクセスするだけで十分です。各ページ内の1つのアドレスに1バイト(またはその他の量)。
これにより、ページ フォールトが発生し、タッチするマッピング内のすべてのページのゼロ ページでコピー オン ライト操作がトリガーされます。これにより、既にゼロになっているページがコミットされるか、メモリの未使用のゼロになっていない物理ページがゼロになります。何も残らなくなるまで、その時点でプロセスは OOM キラーによって強制終了されます (または、どちらがSIGBUS
プロセスを最初にヒットしたかに応じて、 を受け取ります)。
ある程度「クリーン」にしたい場合 (つまり、OOM キラーを使用しない場合)、最後のページに触れる前に停止する必要があることは明らかです。しかし、一般的には、これで十分です。
このようにすべての物理ページを消去することはできませんが、実際にはユーザー プロセスでそれを行う方法はありません (スワップなしではなく、決定論的な方法でもありません)。他のプロセスによってコミットされたページまたはカーネルに属するページは、少なくとも確実ではありませんが、このアプローチでは上書きできません(スワップがないため、運が良ければ OOM があるかもしれませんが、これらはスワップアウトできません)。自分のプロセスではなく他のプロセスを強制終了します)。
一般に、実行中のカーネルを置き換えない限り、100% 信頼できる方法で物理メモリを上書きすることはできません。
超「徹底」したい場合、唯一の選択肢は、カーネルモードから呼び出すmemtest_x86などにあるコードを記述し、実行中のカーネルを置き換えて生の物理メモリを「難しい方法」で上書きすることです。 memtest_x86 も同様です。
しかし、極度のパラノイア ルートに進む場合は、GPU メモリをクリアし、ハードディスク キャッシュとネットワーク カード メモリも消去することを忘れないでください...
1実際には、最大コミット サイズのサイズのマッピングを作成する必要がありますが、スワップはないと述べたので、「RAM のサイズ」で十分です。最新のディスク ドライブがどのように広範なウェア レベリングを行っているかを確認すると、スワップを上書きしてもあまり役に立ちませんが、少なくとも最大コミット サイズまでコミットすれば、すべての RAM ページにヒットしていることを保証できます。