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

关闭前擦除RAM,Linux如何分配内存?,linux,memory,kernel,ram,dd,Linux,Memory,Kernel,Ram,Dd,我知道很多人认为在关机时擦除RAM是毫无意义的,我对其优缺点做了大量的研究(如果真的值得的话)。所以用最礼貌的方式。。。请不要发表评论,如“为什么要擦除Ram,它毫无意义” 我尝试DD/dev/mem,正如预期的那样,DD抛出了一个错误,内核警告说DD试图访问101000到101200之间的内存。所以我的问题是。。。Linux中的内存是如何分配的?更准确地说,地址101000和101200之间是否存在任何个人信息,或者是否为内核完全保留/保护这些信息 提前谢谢 Tom由于您没有提供详细信息,我假

我知道很多人认为在关机时擦除RAM是毫无意义的,我对其优缺点做了大量的研究(如果真的值得的话)。所以用最礼貌的方式。。。请不要发表评论,如“为什么要擦除Ram,它毫无意义”

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

提前谢谢


Tom

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

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

物理内存是使用二进制伙伴分配器在页面中分配的。对它的描述要详细得多


然而,使用内核代码以外的任何东西擦除物理内存是不可能的,而且可能是危险的(磁盘上的数据损坏)。如果您真的想在关机时擦除RAM,我建议您对内核进行黑客攻击。

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

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

物理内存是使用二进制伙伴分配器在页面中分配的。对它的描述要详细得多


然而,使用内核代码以外的任何东西擦除物理内存是不可能的,而且可能是危险的(磁盘上的数据损坏)。如果您真的想在关机时擦除RAM,我建议您对内核进行黑客攻击。

为了最大限度地擦除物理内存(您提到了
dd
,所以我们讨论的是一个用户域解决方案!),创建一个与已安装的RAM1大小相同的匿名映射,并通过向每个页面内的一个地址写入一个字节(或任何其他数量)来接触每个页面就足够了

这将导致一个页面错误,并在映射中的每个页面的零页上触发一个写时拷贝操作,该操作将提交一个已经归零的页面或将内存中未使用的非归零物理页面归零,直到没有剩余页面为止,此时进程将被OOM killer终止(或将接收到
SIGBUS
,具体取决于哪个先点击您的进程)。
如果你想让它更“干净”(也就是说,没有OOM killer),很明显,你需要在触摸最后一页之前停下来。但一般来说,这就是所需要的

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

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

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



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

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

这将导致一个页面错误,并在映射中的每个页面的零页上触发一个写时拷贝操作,该操作将提交一个已经归零的页面或将内存中未使用的非归零物理页面归零,直到没有剩余页面为止,此时进程将被OOM killer终止(或将接收到
SIGBUS
,具体取决于哪个先点击您的进程)。
如果你想让它更“干净”(也就是说,没有OOM killer),很明显,你需要在触摸最后一页之前停下来。但一般来说,这就是所需要的

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

如果您想要超级“彻底”,那么您唯一的选择就是编写可以在memtest_x86中找到的代码,您可以从内核调用它