为了尽你所能擦除物理内存(你提到dd
了,所以我们正在谈论一个用户空间解决方案!),创建一个与安装的 RAM 1大小相同的匿名映射并通过编写一个触摸每个页面就足够了单个字节(或任何其他数量)到每页内的一个地址。
这将导致页面错误并在您触摸的映射中的每个页面的零页面上触发写时复制操作,这将提交已经归零的页面或将未使用的非归零物理内存页面归零 -直到没有剩余,此时您的进程将被 OOM 杀手杀死(或将收到SIGBUS
,取决于哪个进程首先命中您的进程)。
如果您希望它更“干净”(即没有 OOM 杀手),您显然需要在触摸最后一页之前停下来。但总的来说,这就是它所需要的。
您将无法像这样擦除所有物理页面,但是对于用户进程确实无法做到这一点(不是没有交换,也不是以一种确定的方式)。由其他进程提交的页面或属于内核的页面不能用这种方法覆盖,至少不可靠(因为没有交换,这些不能被换出,尽管你可能很幸运并且有 OOM杀死其他进程而不是你的)。
除非您更换正在运行的内核,否则您通常无法以 100% 可靠的方式覆盖物理内存。
如果您想超级“彻底”,那么您唯一的选择是编写代码,例如在 memtest_x86 中可以找到的代码,您可以从内核模式调用它,替换正在运行的内核并“艰难地”覆盖原始物理内存,很多就像 memtest_x86 一样。
但是,如果您走极端偏执的路线,请不要忘记清除GPU内存并擦除硬盘缓存和网卡内存......
1实际上,您必须创建一个最大提交大小的映射——但您声明没有交换,所以“RAM 大小”就可以了。看看现代磁盘驱动器如何进行广泛的磨损均衡,覆盖交换无论如何都不会有太大帮助,但至少你可以保证如果你提交到最大提交大小,你会访问所有 RAM 页面。