概要原理如下:
1. 在kernel空间使用tuxonice(suspend2的演进版本)进行suspend to disk(hibernation),主要动作是保存当前内存中所有的有效内容到hibernate image预留分区,写入前使用lzo算法进行压缩(启动的时间主要取决于image的大小)
2. Kill掉不重要的service进程(可配置),以减少要已用的内存空间。
3. 在Uboot启动时check hibernate分区是否有可用的hibernate image,如果有读入image,并进行解压,完成后将PC指针设置为了suspend前的值,系统resume完成。
下面首先详细解析hibernation流程
用户空间使用命令“echo disk /sys/power/state”,最终调用到kernel/power/main.c中的hibernate()函数启动hibernation流程,下面是该流程的主要动作:
1)pm_prepare_console();//给suspend分配一个虚拟终端来输出信息
2)pm_notifier_call_chain(PM_HIBERNATION_PREPARE);//通过notification chain广播hibernation prepare消息
3)usermodehelper_disable();//停用usermodehelper,它的功能是kernel用来启动用户空间程序
4)create_basic_memory_bitmaps();//为不需要保存和需要释放的页创建bitmap
5)sys_sync();//同步文件系统