Android快速啓動方案設計原理(hibernation/HyperBoot)

概要原理如下:

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();//同步文件系統
6)prepare_processes();//凍結進程
7)hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM);//創建hibernation image
8)swsusp_write(flags);//將hibernation image寫入預留分區
swsusp_free();
power_down();


hibernation_snapshot流程:

1) hibernate_preallocate_memory//Preallocate image memory before shutting down devices

2) freeze_kernel_threads

3) dpm_prepare

4) suspend_console

5) dpm_suspend//對於註冊了動態電源管理的設備驅動,suspend函數將被調用

6) create_image


主要動作在create_image中完成,流程如下:

1) dpm_suspend_end//調用dpm_suspend_late和dpm_suspend_noirq完成動態電源管理相關的suspend

2) platform_pre_snapshot

3) disable_nonboot_cpus//power off ap(從核)

4) local_irq_disable

5) syscore_suspend//系統core suspend,register_syscore_ops用來註冊system core operation到syscore_ops_list

6) save_processor_state//架構相關代碼,保存當前處理器的所有狀態(ARM:R0~R15 以及協處理器的各寄存器),保存到指定位置,resume的kernel起始PC指針爲restore_processor_state,它將恢復suspend時保存的所有狀態。

7) swsusp_arch_suspend//架構相關代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章