【问题标题】:Wiping RAM before shutdown, How does Linux allocate memory?关机前擦内存,Linux如何分配内存?
【发布时间】:2012-03-24 04:01:13
【问题描述】:

我知道很多人认为在关机时擦除 RAM 是毫无意义的,我已经对优点和缺点进行了相当多的研究(以及是否真的值得)。因此,请以最有礼貌的方式......请不要使用诸如“你为什么要擦拭 Ram,它毫无意义”之类的 cmets。

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

提前致谢

汤姆

【问题讨论】:

  • 好吧,RAM 只是易失性,因此在系统关闭后无需担心。但是,交换分区/文件可能仍包含一些信息,具体取决于您的系统配置。
  • 对不起,我应该补充一点,我正在运行自定义实时分发,所以没有交换空间。
  • 那有什么好担心的呢?为什么要擦除 RAM?确保机器关闭电源的时间可能超过 10 秒,并且它应该是安全的。
  • STATUS_ACCESS_DENIED,请阅读我的问题。我真的不想争论它是否值得做。
  • 我确实阅读了您的问题,即使您想避免辩论,这一点仍然有效。你认为这些内容会被存储在超空间中,然后当能量恢复时以某种方式重新存在吗?我们在谈论 RAM,而不是闪存,对吗?尝试dd 你的/dev/kmem(以root 身份)充其量只会让你崩溃,最坏的情况是破坏进程中持久存储上的一些数据。

标签: linux memory kernel ram dd


【解决方案1】:

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

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

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

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

【讨论】:

  • 已经在 cmets 中写道(关于擦除危险),但为链接 +1。谢谢。
【解决方案2】:

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

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

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

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2011-10-23
    • 2020-03-01
    相关资源
    最近更新 更多