关机前擦除RAM,Linux如何分配内存?

时间:2012-03-06 16:22:40

标签: linux memory kernel ram dd

我知道很多人都认为在关机时擦拭RAM是毫无意义的,我已经对其优缺点进行了一些研究(如果真的值得的话)。所以用最好的礼貌方式......请不要评论诸如“你为什么要擦拭拉姆,它毫无意义”

我尝试了DD / dev / mem并且正如预期的那样DD抛出错误并且内核警告说DD试图访问101000和101200之间的内存。所以我的问题是......如何在Linux中分配内存并且更精确,地址101000和101200之间是否存在任何个人信息,还是内核完全保留/保护?

提前致谢

汤姆

2 个答案:

答案 0 :(得分:3)

由于您没有提供任何详细信息,我假设您使用的是在x86上运行的最新内核版本。

Linux documentation在引导后提供物理内存布局。您可以看到内核在地址0x100000处加载。这意味着在你所询问的地区(0x101000 - 0x101200)只有内核代码。

使用二进制伙伴分配器在页面中分配物理内存。更详细地描述了here

但是,使用除内核代码之外的任何东西擦除物理内存是不可能的,并且可能很危险(磁盘上的数据损坏)。如果你真的想在关机时擦除内存,我建议你破解内核。

答案 1 :(得分:0)

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

这将导致页面错误并在您触摸的映射中的每个页面的零页面上触发写入时复制操作,这将提交已经归零的页面或零未使用的非归零物理页面记忆 - 直到没有剩下的,此时你的过程将被OOM杀手杀死(或者将接收SIGBUS,取决于哪一个首先击中你的过程。)
如果你想让它更“清洁”(也就是说,没有OOM杀手),你需要在触摸最后一页之前停下来,显然。但总的来说,这就是全部。

能够擦除这样的所有物理页面,但实际上没有办法用户进程(不是没有交换,而不是确定性< / em>方式)。 使用此方法无法覆盖属于内核的其他进程或页面提交的页面,至少不能可靠(因为没有交换,这些不能被换出,但是你可能很幸运,让OOM杀死其他进程而不是你的进程。) 除非替换正在运行的内核,否则通常不能以100%可靠的方式覆盖物理内存。

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

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


1 实际上,你必须创建一个大小最大提交大小的映射 - 但你说没有交换,所以“大小RAM“会做的。看看现代磁盘驱动器如何进行广泛的耗损均衡,覆盖交换无论如何都无济于事,但至少如果你承诺达到最大提交大小,你可以保证你能够访问所有的RAM页面。