S4:suspend to disk
基于Linux-3.16.0内核
(1)进入S4的调用脉络
state_store
hibernate
hibernation_snapshot
create_image
swsusp_arch_suspend//调用汇编code,进入S4
/*当从S4返回时会接着执行后面的code
*S4返回是由new kernel通过software_resume转到该处执行
*software_resume是在initcall 7s段执行
*/
...
restore_processor_state
...
(2)从S4返回。称S4返回时的kernel为new kernel,进入S4之前的kernel为old kernel。从S4返回的时候,new kernel执行software_resume,首先suspend当前new kernel,然后会转向old kernel调用swsusp_arch_suspend的地方继续执行,这样就把平台切换到old kernel状态。如果resume失败,那么就会让new kernel从suspend状态返回,平台的控制权还是在new kernel手中。
/*#define late_initcall_sync(fn) __define_initcall(fn, 7s)*/
late_initcall_sync(software_resume);
software_resume
hibernation_restore
resume_target_kernel
swsusp_arch_resume
/*接下来的执行会转向swsusp_arch_suspend调用的地方执行
*只有resume失败的时候才会执行后续的code
*/
(3)hibernation_ops的初始化脉络,hibernation_ops最终初始为acpi_hibernation_ops/acpi_hibernation_ops_old
/*#define subsys_initcall(fn) __define_initcall(fn, 4)*/
subsys_initcall(acpi_init);
acpi_init
acpi_bus_init
acpi_sleep_init
acpi_sleep_suspend_setup//S3时ops的初始化
acpi_sleep_hibernate_setup//S4时ops的初始化
hibernation_set_ops(old_suspend_ordering ? &acpi_hibernation_ops_old : &acpi_hibernation_ops);