当Linux系统休眠并从休眠中恢复时,我认为内核需要知道它正在恢复,而不是引导。否则,内核将启动通常的引导过程,并且不会加载交换的数据。内核如何知道它正在恢复呢?
起初,我认为粗食 (或另一个引导加载程序)通过内核参数告诉内核。但是只要我检查/proc/cmdline,内核参数就和往常一样。是否有任何机制让内核知道它正在恢复?
发布于 2022-12-22 11:11:12
休眠的工作方式是使用交换分区1 1交换所有进程的内存,内核状态,最后保存CPU的某些状态,并可能保存其他设备,然后关闭电源。在此过程中,它在交换分区中注意到这是一个休眠映像。
通过告诉内核使用resume=内核参数、resume=/dev/sda4 (if /dev/sda4 4是交换分区)、resume=UUID=deadbeef-cafe-b00b-1337-123456123456或类似的方法,从休眠恢复工作。
然后,内核在引导过程中查看该分区,在交换分区中找到说明“嘿,这是一个休眠映像”的注释,并从中恢复设备、内核和进程。如果便条不在那里,它就会像平常一样启动。
您可以检查源代码,特别是software_resume()函数的描述:
* software_resume - Resume from a saved hibernation image.
*
* This routine is called as a late initcall, when all devices have been
* discovered and initialized already.
*
* The image reading code is called to see if there is a hibernation image
* available for reading. If that is the case, devices are quiesced and the
* contents of memory is restored from the saved image.因此,这涉及内核的两个实例,即“引导内核”和“映像内核”,这个过程在官方内核文档中进行了描述,这也解释了为什么不通过引导加载程序来完成:
虽然在原则上,映像可能被加载到内存中,并且引导加载程序还原的预休眠内存内容,但在实践中这是无法做到的,因为引导加载程序不够聪明,并且没有为传递必要信息建立的协议。因此,引导加载程序将名为“还原内核”的内核的新实例加载到内存中,并以通常的方式将控制传递给它。然后,恢复内核读取系统映像,恢复预休眠内存内容,并将控制传递给映像内核。因此,从休眠恢复涉及两个不同的内核实例。
这些天,也可以是一个交换文件的许多(大多数?)文件系统,或LVM卷…。。
https://unix.stackexchange.com/questions/729274
复制相似问题