linux查看电源模块,基于LINUX的电源管理cpuidle模块研究及应用

赵婉芳

摘 要:本文主要针对LINUX嵌入式系统的电源管理部分,分析了目前存在的主要的电源管理技术,重点研究了LINUX系统中当系统处于空闲状态时负责电源管理的CPUIDLE模块结构特点以及接口核心编码,对基于LINUX系统的电源管理研究有一定的参考意义。

关键词:LINUX系统;CPUIDLE模块;接口

中图分类号:TP368 文献标识码:A 文章编号:1671-2064(2017)22-0019-01

随着移动互联技术的发展,越来越多的便携式移动终端被链接入网,对于移动终端的待机时长,安全性和稳定性提出了更高的要求,由于便携式终端具有移动性强,体积小的特点,主要选择使用电池供电,因此如何对具有电能消耗的嵌入式系统进行动态电源规划管理,使得电池的寿命延长,最大限度的提升电能的使用率是该领域的研究热点之一。

1 电源管理技术

目前电源管理技术主要分为静态电源管理和动态电源管理两种方式。静态电源管理(SPM)主要使用在PC机端,目前有两个工业标准,分别是高级电源管理APM和高级配置和电源管理接口ACPI,在两个标准中都对静态电源管理的实现进行了详细的状态定义。静态电源管理的基本思想是把系统看作一个有限状态机,其中包括多种工作状态,每种工作状态对应一个参数集合,这个参数集合表示的是该工作状态下的功耗和性能参数等。系统可以根据自身的负载情况在各个工作状态之间进行切换,也可以由用户根据自身需要进行某个工作状态的设置。当系统空闲,零负载或者负载比较小的时候,系统就会控制设备进入低性能状态或者低功耗状态,当系统请求较多,负载较高时,系统就会控制设备进入高性能状态或者高功耗状态。系统主要的四个状态为:正常运行态,待机态,挂起态,深度休眠态。

动态电源管理(DPM)则广泛应用于嵌入式移动终端设备,是一种系统级的功耗控制技术。动态电源管理的基本思想是设想系统由多个部件组成,每个部件可以有多种工作状态,每种工作状态对应着不同的电压和时钟频率,因此有着不同的功率消耗。动态电源管理主要依据系统运行时各部件的具体负载情况,调整设备进入适合的功耗状态,以此来节省功耗。由于动态管理系统随时在繁忙和空闲等工作状态之间进行切换,在进入和退出工作状态时会带来一定的延时,因此,如果状态切换太过频繁,带来的延时会抵消节省功耗带来的益处,降低系统性能。所以在动态电源管理中,最重要的是选择好正确的管理策略,取得功耗和延时及性能之间的最佳平衡点。动态电源管理策略通常分为四种类型:(1)超时策略;(2)贪婪策略;(3)基于随机过程策略;(4)预测策略。

2 CPUIDLE模块

Linux系统中,支持CPU电源管理的模块主要分为CpuIdle和cpufreq两个模块,当系统处于空闲状态时主要由cpuidle framework来负责管理这种空闲状态时的电源功耗,当 CPU活跃时,则由cpufreq模块来负责管理电源的使用。在Linux内核中,cpuidle架构位于“drivers/cpuidle”文件夹中,分别包含三个模块,分别为:cpuidle core:负责实现cpuidle framework的整体框架;cpuidle governors:负责管理方案的选取; cpuidle drivers:定义每一个状态的功耗和延迟分别是多少并负责idle机制的实现,即:如何进入idle状态,什么条件下会退出,等等。以上三个模块再结合位于kernel sched中的cpuidle entry,共同完成cpu的空闲管理,CpuIdle模块的软件结构如图1所示。

在cpuidle架构中最重要的就是cpuidle governor部分,它负责具体电源管理方案的选取,因此电源管理是否有效,关键在于governor的配置使用。在当前的系统内核中CpuIdle模块主要有两个governor部件,分别为ladder governor和menu governor,它们分别使用于不同的系统中。对于现在的大部分系统,由于电源管理的原因以及延迟容忍度的处理,大多系统都是使用menu governor来选择一个合适的空闲状态。在menu governor工作过程中,其综合考虑并计算系统切换不同状态时所花费的功耗以及带来的延迟容忍程度,最终来选择所要进入的空闲状态,因此该部分是cpuidle模块中电源管理的核心部分,如何使用该部分成为系统处于空闲状态是时能否达到最佳节能目的关键。

3 governor接口

Governor的使用是通过接口程序来实现的,cpuidle_ governor结接口程序通过cpuidle core使用struct cpuidle_ governor结构抽象得到,以下是governor的标准接口程序:

struct cpuidle_governor {

char name[CPUIDLE_NAME_LEN];

struct list_head governor_list;

int (*init) (struct cpuidle_device *dev);

void (*exit) (struct cpuidle_device *dev);

void (*scan) (struct cpuidle_device *dev);

int (*select) (struct cpuidle_device *dev);

void (*reflect) (struct cpuidle_device *dev);

struct module *owner;

};

其中,由cpuidle調用init()方法来初始化控制器;

调用exit()方法可以退出控制器;

scan()方法用于重新检测设备所处的状态。这样能保证及时获取到状态的变化;

select() 方法在系统进入空闲状态之前被调用,该方法根据当前系统的运行状况,以及各个idle state的特性,选择一个决策;

cpuidle_register_governor()方法和cpuidle_unregister _governor()方法用于注册或注销一个cpuidle governor;

reflect()是个回调函数,通过该函数告知governor,系统上一次所处的空闲状态是哪一个(即系统从哪一个state回来)。

4 结语

随着物联网的发展,对于终端电源的能耗将要求越来越高,电源管理将会成为行业发展的关键点。本文主要分析了目前存在的静态和动态电源管理技术,研究了LINUX系统中当系统处于空闲状态时负责电源管理的CPUIDLE模块结构特点以及接口核心编码,对基于LINUX系统的电源管理方面研究有一定的参考意义。

参考文献

[1]邹思轶.嵌入式Linux设计与应用[M].北京:清华大学出版社,2001.

[2]许海燕,付炎.嵌入式系统技术和应用[M].北京:机械工业出版社,2002.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值