将堆栈和堆内存转储到文件,然后将其加载回 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?的主要内容,如果未能解决你的问题,请参考以下文章