Linux内核电源管理全解析
1. 背景与需求
随着移动设备功能日益复杂,以顺应商业趋势并满足消费者需求,大多数此类设备运行基于Linux的操作系统,且均由电池供电。消费者不仅要求设备具备完整功能和高性能,还期望设备拥有尽可能长的续航能力和持久耐用的电池。然而,高性能和节能是两个相互矛盾的概念,因此在使用设备时,必须找到两者之间的平衡点,这就需要借助电源管理(Power Management,PM)技术。
2. 技术要求
为了更好地理解后续内容,你需要具备以下条件:
- 基础的电气知识
- 基础的C编程技能
- 良好的计算机体系结构知识
- 可从https://github.com/torvalds/linux获取的Linux内核4.19源代码
3. Linux系统电源管理概念
电源管理的核心目标是在任何时候尽可能降低功耗。操作系统需要处理两种类型的电源管理:设备电源管理和系统电源管理。
3.1 设备电源管理
设备电源管理是针对特定设备的,允许在系统运行时将设备置于低功耗状态。例如,在不打字时关闭键盘背光灯以节省电量。设备电源管理也被称为运行时电源管理(Runtime Power Management),可以通过显式调用对设备进行操作,也可以在设备闲置一段时间后自动触发。
3.2 系统电源管理(睡眠状态)
系统电源管理使平台能够进入全系统的低功耗状态,即睡眠状态。系统可以根据平台、其能力和目标唤醒延迟进入多种低功耗状态。例如,关闭笔记本电脑的盖子、关闭手机屏幕或达到某些临界状态(如电池电量低)时,系统会进入睡眠状态。在系统进入睡眠状态之前,会保存运行系统的状态,恢复供电后再恢复该状态,从而避免整个关机和启动序列。
系统电源管理和运行时电源管理虽然处理不同的空闲管理场景,但对于防止平台浪费电力都非常重要,它们是相辅相成的。
4. 运行时电源管理
运行时电源管理是Linux电源管理的一部分,用于管理单个设备的电源,而不将整个系统置于低功耗状态。在这种模式下,操作在系统运行时生效,因此也被称为动态电源管理。
4.1 动态电源管理接口
除了驱动开发者可以在设备驱动中实现的每个设备的电源管理功能外,Linux内核还提供了用户空间接口来添加、删除或修改电源策略。以下是一些最著名的接口:
-
CPU Idle
:在CPU没有任务执行时,协助管理CPU的功耗。
-
CPUFreq
:根据系统负载,允许动态调整CPU的电压和频率。
-
Thermal
:根据系统预定义区域(通常靠近CPU)的温度,调整电源属性。
4.2 CPU Idle
当系统中的逻辑CPU没有任务执行时,为了节省电力,可能需要将其置于特定状态。大多数操作系统会调度一个所谓的空闲线程,此时CPU处于空闲状态。CPU Idle是一个管理空闲线程的框架,有多个空闲级别(或模式、状态),这些状态通常被称为C状态。C0是正常的CPU运行模式,CPU 100%开启;随着C编号的增加,CPU的睡眠模式会更深,需要更长的时间才能恢复到C0模式。
每个空闲状态由以下三个特征描述:
-
退出延迟(Exit Latency,单位:µS)
:退出该状态所需的延迟。
-
功耗(Power Consumption,单位:mW)
:该值并非总是可靠。
-
目标驻留时间(Target Residency,单位:µS)
:从该空闲持续时间开始,使用此状态变得有意义。
CPU Idle驱动是特定于平台的,Linux内核期望CPU驱动最多支持10个状态,但实际状态数量取决于底层CPU硬件。选择进入哪个状态是基于由 governors 管理的策略。
在这种情况下,governor是一个简单的模块,实现了一种算法,根据某些属性选择最佳的C状态。有两种CPU Idle governors:
-
ladder
:适用于基于周期性定时器滴答的系统。
-
menu
:适用于无滴答系统。
选择使用哪个governor取决于内核的配置,特别是空闲循环是否可以停止调度器滴答。可以通过以下命令查看当前的governor:
$ cat /sys/devices/system/cpu/cpuidle/current_governor_ro
在ARM平台上,空闲状态可以在设备树中描述。
4.3 CPUfreq(动态电压和频率缩放,DVFS)
CPUfreq框架允许根据约束、需求、用户偏好或其他因素,动态选择CPU的电压和缩放频率。该框架使用操作性能点(Operating Performance Points,OPPs)的概念,用{频率, 电压}元组表示系统的性能状态。
OPPs可以在设备树中描述,相关的绑定文档可以在Documentation/devicetree/bindings/opp/opp.txt中找到。
CPUfreq也使用governor的概念,以下是该框架中的一些governor:
| Governor名称 | 特点 |
| ---- | ---- |
| ondemand | 采样CPU负载,积极调整频率以提供适当的处理能力,必要时将频率重置为最大值。 |
| conservative | 与ondemand类似,但采用较温和的方法增加OPPs,不会从最低OPPs直接跳到最高OPPs。 |
| performance | 始终选择具有最高频率的OPPs,优先考虑性能。 |
| powersave | 始终选择具有最低频率的OPPs,优先考虑节能。 |
| userspace | 允许用户通过echo命令将所需的OPPs值写入/sys/devices/system/cpu/cpuX/cpufreq/scaling_setspeed来设置。 |
| schedutil | 作为调度器的一部分,可以访问调度器数据结构,以获取更可靠和准确的系统负载统计信息,从而更好地选择合适的OPPs。 |
可以使用以下命令查看可用的governor:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
查看当前的governor:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
设置governor:
$ echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
查看当前的OPPs(频率,单位:kHz):
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
查看支持的OPPs(频率,单位:kHz):
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
更改OPPs(仅在选择ondemand governor时有效):
$ echo 275000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
4.4 热管理(Thermal)
热管理框架专门用于监控系统温度,根据温度阈值有专门的配置文件。热传感器检测热点并报告,该框架与冷却设备协同工作,以帮助散热,控制或限制过热。
热管理框架使用以下概念:
-
热区(Thermal Zones)
:可以将热区视为需要监控温度的硬件。
-
热传感器(Thermal Sensors)
:用于测量温度的组件,为热区提供温度传感功能。
-
冷却设备(Cooling Devices)
:提供散热控制,通常有两种冷却方法:被动冷却(通过调节设备性能,使用DVFS)和主动冷却(激活特殊冷却设备,如风扇)。
-
触发点(Trip Points)
:描述建议进行冷却操作的关键温度(实际上是阈值),这些点是根据硬件限制选择的。
-
Governors
:包含根据某些标准选择最佳冷却方式的算法。
-
冷却映射(Cooling Maps)
:用于描述触发点和冷却设备之间的关联。
热管理框架可以分为四个部分:热区、热governor、热冷却和热核心,热核心是前三个部分之间的纽带。可以在用户空间的/sys/class/thermal/目录下管理该框架:
$ ls /sys/class/thermal/
cooling_device0 cooling_device4
cooling_device8 thermal_zone3 thermal_zone7
cooling_device1 cooling_device5
thermal_zone0 thermal_zone4
cooling_device2 cooling_device6
thermal_zone1 thermal_zone5
cooling_device3 cooling_device7
thermal_zone2 thermal_zone6
每个thermal_zoneX文件代表一个热区驱动程序,该驱动程序会暴露需要冷却的触发点,并提供与传感器关联的冷却设备列表。热管理工作流程是通过热区驱动程序获取温度,然后通过热governor做出决策,最后通过热冷却进行温度控制。
热管理工作流程mermaid流程图
graph LR
A[热区驱动程序获取温度] --> B[热governor做出决策]
B --> C[热冷却进行温度控制]
CPU Idle状态转换mermaid流程图
graph LR
A[CPU空闲] --> B{选择空闲状态}
B -->|根据governor策略| C[进入C状态]
C --> D{有任务到来}
D -->|是| E[退出C状态]
D -->|否| C
综上所述,Linux内核提供了丰富的电源管理功能,通过合理配置和使用这些功能,可以在保证系统性能的前提下,最大程度地降低功耗,延长设备的续航时间。
5. 电源管理在实际应用中的操作与优化
5.1 设备驱动中添加电源管理功能
为设备驱动添加电源管理功能,可让设备在不使用时进入低功率状态,从而节省能源。以下是添加电源管理功能的一般步骤:
1.
初始化设备
:在设备驱动的初始化函数中,注册电源管理回调函数。这些回调函数将在设备进入或退出低功率状态时被调用。
2.
实现回调函数
:实现电源管理回调函数,如
suspend
和
resume
。
suspend
函数负责将设备置于低功率状态,而
resume
函数负责将设备恢复到正常工作状态。
3.
注册电源管理
:在设备驱动中注册电源管理,以便内核知道该设备支持电源管理。
以下是一个简单的示例代码,展示了如何在设备驱动中添加电源管理功能:
#include <linux/module.h>
#include <linux/device.h>
static int my_device_suspend(struct device *dev)
{
// 将设备置于低功率状态
printk(KERN_INFO "My device is going to sleep.\n");
return 0;
}
static int my_device_resume(struct device *dev)
{
// 将设备恢复到正常工作状态
printk(KERN_INFO "My device is waking up.\n");
return 0;
}
static SIMPLE_DEV_PM_OPS(my_device_pm_ops, my_device_suspend, my_device_resume);
static struct device my_device = {
.init_name = "my_device",
.pm = &my_device_pm_ops,
};
static int __init my_device_init(void)
{
int ret;
ret = device_register(&my_device);
if (ret) {
printk(KERN_ERR "Failed to register device.\n");
return ret;
}
return 0;
}
static void __exit my_device_exit(void)
{
device_unregister(&my_device);
}
module_init(my_device_init);
module_exit(my_device_exit);
MODULE_LICENSE("GPL");
5.2 作为系统唤醒源
某些设备可以作为系统的唤醒源,使系统从低功率状态中唤醒。要将设备配置为唤醒源,需要执行以下步骤:
1.
支持唤醒功能
:设备驱动必须支持唤醒功能,并在设备初始化时注册唤醒回调函数。
2.
启用唤醒功能
:在设备驱动中启用唤醒功能,以便内核知道该设备可以作为唤醒源。
3.
配置唤醒源
:在系统配置中,将设备配置为唤醒源。
5.3 优化电源管理策略
为了进一步优化电源管理,可以考虑以下策略:
-
调整CPU Idle和CPUFreq的governor
:根据系统的使用场景和负载情况,选择合适的governor。例如,在电池供电的设备上,可以选择
powersave
或
conservative
governor 以节省能源。
-
合理配置热管理
:根据系统的散热情况,调整热管理的触发点和冷却设备的使用。例如,在高温环境下,可以提前启动冷却设备。
-
优化设备驱动
:确保设备驱动在不使用时能够及时进入低功率状态,并在需要时快速恢复到正常工作状态。
电源管理优化策略表格
| 优化策略 | 具体操作 |
|---|---|
| 调整CPU相关governor | 根据系统使用场景和负载选合适governor,如电池供电选powersave或conservative |
| 合理配置热管理 | 根据散热情况调整触发点和冷却设备使用,高温提前启动冷却设备 |
| 优化设备驱动 | 确保设备驱动不使用时及时进入低功率状态,需要时快速恢复 |
6. 总结与展望
6.1 总结
Linux内核提供了一套完整的电源管理解决方案,包括设备电源管理、系统电源管理、运行时电源管理等。通过合理配置和使用这些功能,可以在保证系统性能的前提下,最大程度地降低功耗,延长设备的续航时间。
6.2 展望
随着移动设备和嵌入式系统的不断发展,对电源管理的要求也越来越高。未来,Linux内核的电源管理功能可能会进一步优化和扩展,以满足不断变化的需求。例如,可能会引入更加智能的电源管理算法,根据系统的实时负载和环境条件自动调整电源策略。
同时,随着硬件技术的不断进步,新的电源管理技术也可能会被集成到Linux内核中,如新型的低功耗芯片和散热技术。这将为开发者提供更多的选择和可能性,进一步提升系统的能源效率。
电源管理未来发展mermaid流程图
graph LR
A[当前电源管理现状] --> B[不断发展的移动和嵌入式系统需求]
B --> C[Linux内核电源管理优化扩展]
C --> D[引入智能电源管理算法]
C --> E[集成新硬件电源管理技术]
D --> F[更高效电源策略]
E --> F
总之,Linux内核的电源管理是一个不断发展和完善的领域,对于开发者和用户来说,了解和掌握这些技术将有助于提升设备的性能和续航能力。
超级会员免费看
1524

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



