CPU动态调频(linux 3.14.0)一
最近做了一个关于CPU动态调频的project,边工作边学习,在此记录一下。
code版本:3.14.0(在linxu目录顶层Makefile中可看到版本号)
设备:基于安卓4.4原生系统的某厂商的手机(以下用XXX代表设备)
网上有不少关于动态调频的博文,都是先介绍整体框架,然后理解数据结构,最后分析关键代码,这是一种非常适合学习的循序渐进的过程。
而我在接触这个项目的时候,是先有需求后看代码,之前对动态调频一无所知,所以写笔记的话按照我自己的学习过程来会更自然一些。
即本文的思路是——遇到特定的问题,学习相关的代码,最后整体总结。
遇到的第一个问题是:用户如何直观的看到CPU的频率?
这个问题百度一下就知道了:通过sysfs文件系统,具体的目录是:
/sys/devices/system/cpu/cpu0/cpufreq/
该目录下有以下的属性文件(不同设备可能略有差别):
affected_cpus
cpuinfo_cur_freq
cpuinfo_max_freq
cpuinfo_min_freq
cpuinfo_transition_latency
interactive
related_cpus
scaling_available_frequencies
scaling_available_governors
scaling_cur_freq
scaling_driver
scaling_governor
scaling_max_freq
scaling_min_freq
scaling_setspeed
stats
我们只看自己比较关注和常用的一些,其中前缀是scaling的属性文件表示软件可调节的几种属性,前缀是cpuinfo的属性文件表示硬件支持的几种属性。
关于软件调节和硬件支持,应该是这样的一个关系:设备的最终工作频率是由软件调节后决定的,而软件调节的工作频率必须是硬件(即CPU)所支持的,进一步说,软件调节的范围必须是硬件支持的频率范围的一个子集。
假设:
cpuinfo_max_freq 的值为1901000,硬件支持的最大频率
cpuinfo_min_freq 的值为900000,硬件支持的最小频率
那么软件调节的范围只能是在900000~1901000之间,并且是其中的某几个值,用scaling_avaliable_frequencies可查看。
我们在sysfs下还看到诸如scaling_available_governors、scaling_driver等interface,在cpufreq子系统中(以下简称cpufreq), policy 、governor、driver是几个比较核心的概念。cpufreq的最终目的是动态调节频率,在前面提到,软件调节是有一定范围的,并且该范围(可以称为频率表)是硬件支持的一个子集,这个频率表的最大值和最小值是由policy决定的,当然不同的policy采用的频率表的范围不同。OK,现在我们用policy制定了频率表的范围,对应sysfs下的scaling_min_freq和scaling_max_freq,governor会从频率表中选择一个值最为CPU的最终工作频率。governor可以理解为“调节器“,查看scaling_available_governors可以知道设备支持哪些governor,比如我的设备支持ondemand userspace interactive performance等,每种governor有着不同的选频标准,比如ondemand会根据系统的workload来选频,如果当前workload超过某一阀值,则选择频率表中的最大频率,其他的几种governor后面有机会再介绍。假设某个governor根据一定的机制从频率表中选择了某个频率,接下来driver负责将governor选择的频率设置为CPU的工作频率。
policy、governor、driver是cpufreq中的核心模块,对应源码中的结构体cpufreq_policy、cpufreq_governor、cpufreq_driver,这里不打算对结构体的成员进行一一解释。
总结一下:
1、硬件有一个频率表,表示硬件支持的所有频率(与硬件平台相关);
我在对应的DTS文件中应该找到了 xxx,cpufreq-table = <111 222 333>; (xxx是厂商名,table中的数字无意义)
2、policy规定了软件调节的最大和最小频率,更新了1中的频率表(与硬件平台无关);
3、governor从cpufreq table中选择一个频率作为cpu将要工作的频率(与硬件平台无关);
4、把脏活累活交给driver,driver负责设置CPU的工作频率。(与硬件平台相关)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。