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

为了尽你所能擦除物理内存(你提到dd了,所以我们正在谈论一个用户空间解决方案!),创建一个与安装的 RAM 1大小相同的匿名映射并通过编写一个触摸每个页面就足够了单个字节(或任何其他数量)到每页内的一个地址。

这将导致页面错误并在您触摸的映射中的每个页面的零页面上触发写时复制操作,这将提交已经归零的页面或将未使用的非归零物理内存页面归零 -直到没有剩余,此时您的进程将被 OOM 杀手杀死(或将收到SIGBUS,取决于哪个进程首先命中您的进程)。
如果您希望它更“干净”(即没有 OOM 杀手),您显然需要在触摸最后一页之前停下来。但总的来说,这就是它所需要的。

您将无法像这样擦除所有物理页面,但是对于用户进程确实无法做到这一点(不是没有交换,也不是以一种确定的方式)。由其他进程提交的页面或属于内核的页面不能用这种方法覆盖,至少不可靠(因为没有交换,这些不能被换出,尽管你可能很幸运并且有 OOM杀死其他进程而不是你的)。
除非您更换正在运行的内核,否则您通常无法以 100% 可靠的方式覆盖物理内存。

如果您想超级“彻底”,那么您唯一的选择是编写代码,例如在 memtest_x86 中可以找到的代码,您可以从内核模式调用它,替换正在运行的内核并“艰难地”覆盖原始物理内存,很多就像 memtest_x86 一样。

但是,如果您走极端偏执的路线,请不要忘记清除GPU内存并擦除硬盘缓存和网卡内存......


1实际上,您必须创建一个最大提交大小的映射——但您声明没有交换,所以“RAM 大小”就可以了。看看现代磁盘驱动器如何进行广泛的磨损均衡,覆盖交换无论如何都不会有太大帮助,但至少你可以保证如果你提交到最大提交大小,你会访问所有 RAM 页面。

于 2014-02-16T14:11:09.077 回答