首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux内核中CPU主频和电压调整

Linux内核中CPU主频和电压调整

CPUFreq Governor/管理器

什么是CPUFreq Governor?
大多数cpufreq驱动(事实上,除了longrun, 所有的都是),甚至大多数的处理器频率调整算法
都仅只支持处理器被设置成一个特定的频率。为了提供动态频率调整,cpufreq 核心必须能够
告知驱动程序一个目标频率。如此,驱动程序才能够提供一个 "->target" 函数调用,而不是一个
已经存在的 ”->setpolicy 函数调用。
对于 ”longrun“ 模式, 所有的主频率都保持一致。

然而,对于一个给定的 CPUFreq policy 中,如何去决定使用其中的一个频率呢?
这就是 ”CPUFreq governor“扮演的功能

通常,内核中至少具有 powersave 和 performance 两种模式。
前者是最低频率/低功耗模式,后者是最高频率/高性能模式。


Linux 内核中的Governors
performance    静态设置处理器频率到scaling_min_freq/scaling_max_freq频限定义的最高频率
powersave       静态设置处理器频率到scaling_min_freq/scaling_max_freq频限定义的最低频率
userspace        允许用户或任何用户态程序以 UID=root模式设置处理器频率为一个特定频率
                          通过创建CPU-device目录中的 scaling_setspeed文件来实现
ondemand        根据当前用途来决定处理器频率。
                           为了实现此模式,处理器必须具有非常快速切换频率的能力。

conservative     非常类似OnDemand模式,根据当前使用情况来设置处理器频率。
                           其区别在于,此模式能较平滑的增加或减小处理器速度;而不是一有负载发生
                           就立即切换到最高频率。此模式更适用于电池供电环境。
                           通过sysfs, 此模式具有如下变量设置:
                            freq_step:        其定义了处理器应该平滑增加/减少的频率间隔步长。
                                                      缺省 为处理器最高频率的5%。
                                                      此值可在0~100间变动。0 表示锁定处理器频率而无论负载情况如何。
                                                      100则表示conservative模式退化成为 OnDemand模式(理论上,不考虑overhead)

                            down_threshold:   类似于 OnDemand 的up_threshold变量,但是表示相反意义。
                                                        其值为20表示,如果负载低于20%, 则处理器将降低频率。



interactive         此模式被设计成对交互性负载延迟敏感。此模式依据负载使用情况设置处理器频率,
                           也类似于 OnDemand 和 Conservative 模式。然而,相比而言,本模式对于如何调整处理器频率更积极。
                           每 X 毫秒采样一次处理器负载, 将导致CPU在 X 毫秒内性能降低。这可能导致丢frame或者UI停顿。
                           与采样CPU的方法相比,本模式采取在离开 cpu idle 后,立即检查是否需要提高处理器频率的方式。
                            当处理器离开 cpu idle 模式,就设置一个在1~2 tick 就会 timeout 的定时器。 如果CPU 在退出
                            空闲模式时和定时器触发之间非常繁忙,就假定处理器处于未全速运行模式并立即切换至最高频率。

                             如果处理器不是足够繁忙因此不需要立即切换到最高频率,Governor 将评估自上一次频率调整以来的处理器负载,
                             选择新的处理器频率并且切换之。


CPUFreq核心的Governor接口
新的governor必须通过 cpufreq_register_governor() 函数向 CPUFreq核心注册自己。
该函数接收如下参数:
governor->name        governor唯一名称
governor->governor   governor回调函数
governor->owner        governor的THIS_MODULE宏



governor->governor 回调函数参数为当前CPU的 cpufreq_policy struct和一个 无符号整型 event 。

有如下几个 events:

CPUFREQ_GOV_START:               Governor 将开始 policy_cpu 任务。

CPUFREQ_GOV_STOP                 Governor 将停止policy_cpu 任务。

CPUFREQ_GOV_LIMITS:               已被 policy->min 和 policy->max 代替。
返回列表