将堆栈和堆内存转储到文件,然后将其加载回 RAM?

Posted

技术标签:

【中文标题】将堆栈和堆内存转储到文件,然后将其加载回 RAM?【英文标题】:Dump stack and heap memory to file, then load it back into RAM? 【发布时间】:2021-10-20 01:57:16 【问题描述】:

正如问题所述。我确信这是可能的,但我找不到有关该主题的信息。

我现在正在做这个作为一个实验,想法基本上是做以下场景:

    启动linux(只是因为我不喜欢windows) 做一些随机的事情 将堆栈和堆内存转储到 1 或 2 个文件 做一些其他随机的事情 将转储加载回内存

我试图达到的效果基本上是休眠一个系统状态,但保持系统运行,然后唤醒之前的状态。不确定我可以在哪里使用它,但听起来很有趣。

编辑:我认为搜索 sysctl hibernate 源会有所帮助,但我什至找不到这些。

更新: 到目前为止,我找到了以下信息:

https://www.kernel.org/doc/html/latest/power/swsusp.html https://help.ubuntu.com/community/PowerManagement/Hibernate https://alioth-archive.debian.org/git/collab-maint/hibernate.git.tar.xz

继续搜索...

我认为这是我需要挖掘的地方: https://github.com/torvalds/linux/search?q=swsusp

另外,正如@Useless 在 cmets 中所说,这里:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/power/hibernate.c?h=v5.14-rc6

【问题讨论】:

休眠状态将包括 inode 和页面缓存,对吗?如果文件系统在第 4 阶段发生更改,我看不出这将如何工作,而且它们现在已经过时了。 (“工作”是指“避免崩溃和/或破坏你的文件系统) 这是我想试验的东西,如果系统现在崩溃也没关系 - 这只是我想做的事情,没有明确的目标。 您可以在power/hibernate.c 中找到内核代码(这是最新的主线,在撰写本文时为 5.14-rc6)。 我不认为你可以在内核之外合理地做到这一点,因为你需要为所有用户保存所有内核状态以及每个运行进程的状态 听起来不错,我会再挖掘一些。如果你把它写下来作为答案,我可以接受。附:感谢您的快速回复和帮助! 【参考方案1】:

编辑:我认为搜索 sysctl hibernate 资源会有所帮助,但我什至找不到那些

这需要在内核中完成,因为存在大量内核和驱动程序状态,并且它需要访问所有正在运行的进程。

你可以从power/hibernate.c开始。

如果您只是跳过对swsusp_arch_suspend() increate_image() 的调用,那么您应该是创建图像然后立即恢复的大部分方法。

您只需要弄清楚如何:

    保持休眠状态,大概现在在恢复时被破坏 稍后运行恢复/解冻代码的一半,当您尚未暂停时

【讨论】:

我相信图像正在被 swsusp_free() 删除,但似乎无法找到它的定义......也许它是特定于平台的,并且根据平台作为模块加载? 我手头没有本地克隆,但如果您下载一个,递归 grep 应该会为您找到它...

以上是关于将堆栈和堆内存转储到文件,然后将其加载回 RAM?的主要内容,如果未能解决你的问题,请参考以下文章

两种语言是不是在 ram 上使用相同的堆栈和堆?

C++ 中的 RAM、硬盘、堆栈和堆是啥?

堆和堆栈内存是如何管理、实现和分配的?

程序栈和堆,它们是如何工作的?

尽管堆保持不变,Java RAM 会增加? [复制]

STM32 板的 RAM、堆和堆栈存储器