Linux devfreq子系统分析及应用

2020-04-30 06:49朱振华
无线互联科技 2020年6期
关键词:功耗

朱振华

摘   要:文章针对Linux的内核devfreq子系统框架进行了抽象分析,理清了子系统内部各关键模块之间的相互关系。通过对子系统框架的分析整理出了devfreq driver的编程框架,并对后续Linux内核devfreq框架的演化进行了展望。

关键词:Linux;设备调频;功耗

随着移动终端性能越来越强大、功能越来越多,其功耗也越来越高。随着功耗的升高,移动终端所配备的电池容量越来越大,电池所占空间也越来越大、重量越来越重,不可避免地和移动终端所倡导的轻薄、便携理念发生了冲突。Linux操作系统建立之初主要应用于台式电脑、工作站、大型机等非移动平台,所以并未对系统功耗进行过多关注。近些年来随着android等移动操作系统的兴起,作为android底层的Linux操作系统在功耗管理方面也有了长足的进步。文章所述的devfreq子系统是Linux功耗管理系统的一个重要子系统,其核心理念是通过某种手段对设备的负载进行动态测量,在设备轻载时降低设备工作电压和频率以最大限度地降低设备运行功耗,在设备重载时及时提高设备工作电压和频率以满足设备的性能需求。通过对设备电压和频率的“按需供给”提高设备运行效能,从而降低设备功耗[1]。

1    devfreq子系统框架分析

Linux devfreq子系统对下封装了设备硬件相关细节,根据硬件提供的设备负载信息和调频调压手段实现了对设备性能的“按需供给”;对上透出了相关sysfs API给用户态应用程序,使应用程序可以根据场景需求动态改变设备调频调压的相关参数和策略,最大限度地满足了用户在不同场景下的多样性需求,使“性能”和“功耗”这一对矛盾体得到了一定程度的统一。Linux devfreq子系统框架如图1所示。

Linux devfreq的基本原理是通过周期性的测量被调设备的负载状况来预估设备未来一段时间的性能需求,并根据此需求来调整设备工作的电压和频率,使设备性能总在“刚刚好满足需求”的频率和电压下工作,从而最大程度地提高设备工作效能[2-3]。

devfreq core会为每一个加入devfreq子系统(devfreq-add-device)的设备启动一个负载监控work:devfreq-monitor。Devfreq-monitor会周期性地通过event框架向设备负载监控单元获取设备负载数据,之后使用驱动指定的governor调频算法计算出未来一段时间设备需要运行的频率电压(update-devfreq),最后通过驱动定制的target方法调用clk和regulator相关接口完成最终的调频调压动作,如图2所示。此work每polling-ms毫秒调度一次,polling-ms的具体数值由devfreq驱动定制。

Linux驱动开发倡导“机制”和“策略”分离,驱动程序提供“机制”,“策略”一般由上层框架或者應用程序指定,从而在保持Linux框架相对稳定的情况下给用户提供了足够的灵活性支持。具体到devfreq框架中,Linux将具体的调频策略抽象为了governor,不同的governor提供不同的get_target_freq方法来实现不同的调频策略。Linux框架提供如下几个governor供驱动和用户态API选择。

(1)performance,设备固定工作在其支持的最高频率上,以追求最高性能。

(2)powersave,设备固定工作在其支持的最低频率上,以追求最低的功耗。

(3)userspace,将调频策略的决策交给了用户态应用程序,并提供相应的调频调压接口供其使用。

(4)ondemand,定时对系统负载情况进行采样分析并据此调节设备工作频率和电压。

通常状况下设备调频驱动会选择ondemand以便devfreq子系统可以自动对设备进行“按需调频”,使设备效能达到最佳。

devfreq event对设备负载监控单元进行了封装,并抽象出了简洁的编程接口给devfreq event driver,使其可以将硬件负载监控单元提供的相关信息轻松纳入devfreq框架供相关governor使用。

2    devfreq子系统驱动开发

devfreq子系统驱动通常包括两个部分:devfreq driver和devfreq event driver。前者是设备调频驱动的主体部分,需要定制本驱动调频策略(governor选择)、选择合适的devfreq-monitor调度周期以及定制自己的调频方法等;后者主要实现设备负载监控单元的相关信息获取和封装供devfreq框架使用。如果设备有独立的clock和power,一般也需要将其纳入到Linux clk子系统和regulator子系统进行管理[4]。

2.1  devfreq  driver

devfreq driver只需要完成如下几步即可完成驱动编码:

(1)完成驱动自己的devfreq-dev-profile定制。Devfreq-dev-profile结构体的主要成员如下。

polling_ms:devfreq_monitor线程的运行周期,单位是ms。

target:调频调压的具体执行方法,一般需要通过clock子系统和regulator子系统相关接口实现。此方法在devfreq_monitor线程中被调用。

Get-dev-status:通过调用event子系统相关方法获取当前周期内设备负载相关信息供governor计算调频目标频点使用。

Get-cur-freq:获取设备的当前运行频率。

(2)驱动probe阶段将本设备加入到devfreq子系统,步骤如下:

从几个governor中选择一个作为设备调频策略。

以定制的devfreq-dev-profile和选定的governor做参数调用devfreq-add-device接口,将本设备加入到devfreq子系统中。

2.2  devfreq  event  driver

(1)Devfreq-event-driver只需要完成如下几步即可完成驱动编码。完成驱动自己的devfreq-event-ops定制。Devfreq-event-ops结构体的主要成员如下:

disable,停止本设备负载监控。

enable,开启本设备性能监控。

Get-event,获取设备负载信息。

(2)驱动probe阶段将本设备加入到devfreq event子系统,步骤如下:

以定制的devfreq-event-ops为参数调用devfreq-event-add-new接口,将本设备加入到devfreq event子系统中。

3    结语

Linux devfreq子系统框架对设备调频软硬件相关复杂性进行了封装,设备调频驱动只需要按照Linux框架要求并根据自身硬件特性提供相关属性和定制相关方法即可,大大降低了设备调频驱动开发难度,加快产品上市速度。

片上系统的clock子系统结构通常是树状结构,所以单独一个device调频往往会影响到相关的父子设备。Linux当前的devfreq框架相对来说还稍显简陋,多用于对较为独立的单一设备进行调频调压,并没有纳入到Linux设备模型中进行统一管理。随着Linux的发展,后续如果device的相关调频动作纳入到设备模型power相关操作,集中由内核统一管理,根据硬件拓扑结构及dts相关配置自动处理上下游设备的依赖关系,devfreq的功能會更加强大。

[参考文献]

[1]宋宝华.Linux设备驱动开发详解-基于最新的Linux 4.0内核[M].北京:机械工业出版社,2010.

[2]周建政,吕柏权.基于linux嵌入式的电源管理的研究[J].仪表技术,2008(1):59-61.

[3]赵婉芳.基于Linux的cpufreq动态电源管理模块研究[J].现代工业经济和信息化,2018(5):72-73,94.

[4]赵婉芳.基于linux的电源管理cpuidle模块研究及应用[J].中国科技纵横,2017(22):19,21.

Analysis and application of Linux devfreq subsystem

Zhu Zhenhua

(Zhuhai Quanzhi Polytron Technologies Inc, Zhuhai 519000, China)

Abstract:This paper analyzes the devfreq subsystem framework of Linux kernel, and clarifies the relationship among the key modules in the subsystem. Through the analysis of the subsystem framework, the programming framework of devfreq driver is sorted out, and the future evolution of devfreq framework of Linux kernel is prospected.

Key words:Linux; device frequency modulation; power consumption

猜你喜欢
功耗
基于任务映射的暗硅芯片功耗预算方法
基于Cortex-M4的油气管道微功耗数据采集器软件设计应用
数字电路功耗的分析及优化
IGBT模型优化及其在Buck变换器中的功耗分析
一种面向星载计算机的功能级功耗估计方法