linux内核电源管理相关函数在kernel/power/main.c中。
入口函数如下:
// kernel\power\main.c
static int __init pm_init(void)
{
int error = pm_start_workqueue();
if (error)
return error;
hibernate_image_size_init();
hibernate_reserved_size_init();
pm_states_init();
power_kobj = kobject_create_and_add("power", NULL);
if (!power_kobj)
return -ENOMEM;
error = sysfs_create_groups(power_kobj, attr_groups);
if (error)
return error;
pm_print_times_init();
return pm_autosleep_init();
}
core_initcall(pm_init);
首先是初始化电源管理的状态信息。pm_states_init()
// kernel\power\suspend.c
const char * const pm_labels[] = {
[PM_SUSPEND_TO_IDLE] = "freeze",
[PM_SUSPEND_STANDBY] = "standby",
[PM_SUSPEND_MEM] = "mem",
};
const char *pm_states[PM_SUSPEND_MAX];
static const char * const mem_sleep_labels[] = {
[PM_SUSPEND_TO_IDLE] = "s2idle",
[PM_SUSPEND_STANDBY] = "shallow",
[PM_SUSPEND_MEM] =

本文详细分析了Linux内核电源管理的初始化过程,包括`pm_states_init()`函数的调用,创建`power`目录,设置属性节点等。系统通过`sys/power/state`节点进入不同状态,如"mem"和"freeze"。当执行`echo mem > state`时,会检查自动睡眠锁,只有所有wake_lock释放后,系统才能进入睡眠状态。内核启动时的`main_wake_lock`防止系统睡眠,解锁此锁则允许进入睡眠。
最低0.47元/天 解锁文章
933

被折叠的 条评论
为什么被折叠?



