linux看cpu频率怎么设置让cpu一直运载在最高频率

linux cpufreq framework(1)_概述
linux kernel主要通过三类机制实现SMP系统CPU core的电源管理功能:
1)cpu hotplug。根据应用场景,enable/disable CPU core,具体可参考“Linux CPU core的电源管理(4)_cpu control”。
2) cpuidle framework。在没有进程调度的时候,让CPU core进入idle状态,具体可参考“”。
3) cpufreq framework。根据使用场景和系统负荷,调整CPU core的电压(voltage)和频率(frequency),具体可参考本文以及后续cpufreq相关的。
对CPU core来说,功耗和性能是一对不可调和的矛盾,通过调整CPU的电压和频率,可以在功耗和性能之间找一个平衡点。由于调整是在系统运行的过程中,因此cpufreq framework的功能也称作动态电压/频率调整(Dynamic Voltage/Frequency Scaling,DVFS)。
本文主要从功能说明和软件架构两个角度介绍cpufreq framework。
2. 功能说明
cpufreq framework的核心功能,是通过调整CPU core的电压和频率,兼顾系统的性能和功耗。在不需要高性能时,降低电压和频率,以降低功耗;在需要高性能时,提高电压和频率,以提高性能。要达到此目的,有两个关键点:
1)如果控制CPU core的电压和频率。
2)何时改变CPU core的电压和频率。
针对这两个关键点,CPU core有两种实现。
实现1:CPU core根据自身的负荷,自动调整电压和频率,不需要OS级别的软件参与。
这种实现,软件复杂度非常低,通常情况下,只需要告诉CPU core电压和频率的调整范围(通过频率表示,scaling_min_freq和scaling_max_freq,也称作policy),CPU core即可自行调整。因此:
关键点1,由CPU core自行处理;
关键点2,OS需要根据大致的应用场景(例如,是高性能场景,还是低性能场景),设定一个频率范围,改变时机,由CPU core自行决定。
注1:由于软件参与度小,该实现的省电效率可能较低。
实现2:CPU core不参与任何的逻辑动作,由OS软件根据系统运行情况,调整电压和频率。
这种实现,几乎完全由软件掌控DVFS行为:
关键点1,基于和提供的接口,控制CPU core的频率和电压;
关键点2,根据应用场景,手动(用户发起,例如省电模式)或者自动(软件自动调整,例如HMP)的调整。
注2:对关键点2来说,如果调整比较频繁,则需要CPU core在不同频率之间转换的速度足够快,后面会详细介绍。
为了实现上述功能需求,cpufreq framework抽象出cpufreq driver、cpufreq policy(策略)、cpufreq governor等多个软件实体,具体请参考下面的说明。
3. 软件架构
cpufreq framework的软件架构如下面图片所示:
对下,cpufreq framework基于cpu subsystem driver、OPP、clock framework、regulator framework等模块,提供对CPU core频率和电压的控制。这一部分主要由cpufreq driver实现。
对上,cpufreq framework会通过cpufreq core、cpufreq governors、cpufreq stats等模块,以sysfs的形式,向用户空间提供cpu frequency的查询、控制等接口。同时,在频率改变的时候,通过notifier通知关心的driver。
内部,cpufreq framework包括cpufreq core、cpufreq driver、cpufreq governors、cpufreq stats等模块,具体功能会在下一章详细分析。
注3:cpufreq driver中有,有一个特别的driver----arm big·little driver,用于实现ARM平台big·little的切换逻辑。虽然arm bit·little和cpufreq不是同一个概念,但它们的目的和逻辑非常类似,因此就放到这里了。后续会有专门的文章介绍该功能,因此分析cpufreq framework其它内容时,会直接把它忽略不表。
4. 软件模块的功能及API描述
4.1 cpufreq core
cpufreq core是cpufreq framework的核心模块,和kernel其它framework类似,它主要实现三类功能:
对上,以sysfs的形式向用户空间提供统一的接口,以notifier的形式向其它driver提供频率变化的通知;
对下,提供CPU core频率和电压控制的驱动框架,方便底层driver的开发;同时,提供governor框架,用于实现不同的频率调整机制;
内部,封装各种逻辑,实现所需功能。这些逻辑主要围绕struct cpufreq_driver、struct cpufreq_policy和struct cpufreq_governor三个数据结构进行,下面会详细分析。
1)struct cpufreq_driver
struct cpufreq_driver用于抽象cpufreq驱动,是平台驱动工程师关注最多的结构,其定义如下:
1: /* include/linux/cpufreq.h */
2: struct cpufreq_driver {
name[CPUFREQ_NAME_LEN];
/* needed by all drivers */
(struct cpufreq_policy *policy);
(struct cpufreq_policy *policy);
/* define one out of two */
(*setpolicy)
(struct cpufreq_policy *policy);
* On failure, should always restore frequency to policy->restore_freq
* (i.e. old freq).
(struct cpufreq_policy *policy,
/* Deprecated */
unsigned int target_freq,
unsigned int relation);
(*target_index)
(struct cpufreq_policy *policy,
unsigned int index);
* Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION
* get_intermediate should return a stable intermediate frequency
* platform wants to switch to and target_intermediate() should set CPU
* to to that frequency, before jumping to the frequency corresponding
* to 'index'. Core will take care of sending notifications and driver
* doesn't have to handle them in target_intermediate() or
* target_index().
* Drivers can return '0' from get_intermediate() in case they don't
* wish to switch to intermediate frequency for some target frequency.
* In that case core will directly call ->target_index().
unsigned int (*get_intermediate)(struct cpufreq_policy *policy,
unsigned int index);
(*target_intermediate)(struct cpufreq_policy *policy,
unsigned int index);
/* should be defined, if possible */
unsigned int
(unsigned int cpu);
/* optional */
(*bios_limit)
(int cpu, unsigned int *limit);
(struct cpufreq_policy *policy);
(*stop_cpu)
(struct cpufreq_policy *policy);
(*suspend)
(struct cpufreq_policy *policy);
(struct cpufreq_policy *policy);
struct freq_attr
/* platform specific boost support code */
(*set_boost)
(int state);
介绍该结构之前,我们先思考一个问题:由可知,driver是用来驱动设备的,那么struct cpufreq_driver所对应的设备是什么?也许从该结构中回调函数的参数可以猜到,是struct cpufreq_policy。但这相当难以理解,后面再分析。
name,该driver的名字,需要唯一,因为cpufreq framework允许同时注册多个driver,用户可以根据实际情况选择使用哪个driver。driver的标识,就是name。
flags,一些flag,具体会在后续的文章中介绍。
init,driver的入口,由cpufreq core在设备枚举的时候调用,driver需要根据硬件情况,填充policy的内容。
verify,验证policy中的内容是否符合硬件要求。它和init接口都是必须实现的接口。
setpolicy,对于第2章所讲的“实现一”,driver需要提供这个接口,用于设置CPU core动态频率调整的范围(即policy)。
target、target_index,对于第2章所讲的“实现二”,driver需要实现这两个接口中的一个(target为旧接口,不推荐使用),用于设置CPU core为指定频率(同时修改为对应的电压)。
后面的接口都是可选的,会在后续的章节中再分析。
有关struct cpufreq_driver的API包括:
1: int cpufreq_register_driver(struct cpufreq_driver *driver_data);
2: int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
4: const char *cpufreq_get_current_driver(void);
5: void *cpufreq_get_driver_data(void);
分别为driver的注册、注销。获取当前所使用的driver名称,以及该driver的私有数据结构(driver_data字段)。
2)struct cpufreq_policy
struct cpufreq_policy是比较抽象的一个数据结构(蜗蜗觉得,是cpufreq framework中最难理解的地方),我们需要借助cpufreq core中的一些实现逻辑,去分析、理解它。
前面我们提到过一个问题,cpufreq driver对应的设备是什么?kernel是这样抽象cpufreq的:
抽象出一个CPU bus(对应的sysfs目录为/sys/devices/system/cpu/,具体可参考相关的描述),所有的CPU device都挂在这个bus上。cpufreq是CPU device的一类特定功能,被抽象为一个subsys interface(有关subsys interface的概念,请参考“”)。
当CPU device和CPU driver匹配时,bus core会调用subsys interface的add_dev回调函数,相当于为该特定功能添加一个“device”,进而和该特定功能的“driver”(这里为cpufreq driver)匹配,执行driver的初始化(probe,或者其它)接口。
那么该“特定功能”应该用什么样的“device”表示呢?应具体功能具体对待。kernel使用cpufreq policy(即“调频策略”)来抽象cpufreq。所谓的调频策略,即频率调整的范围,它从一定程度上,代表了cpufreq的属性。这就是struct cpufreq_policy结构的现实意义:
1: struct cpufreq_policy {
/* CPUs sharing clock, require sw coordination */
cpumask_var_
/* Online CPUs only */
cpumask_var_t
related_ /* Online + Offline CPUs */
unsigned int
shared_ /* ACPI: ANY or ALL affected CPUs
should set cpufreq */
unsigned int
/* cpu nr of CPU managing this policy */
unsigned int
last_ /* cpu nr of previous CPU that managed
* this policy */
struct clk
struct cpufreq_/* see above */
unsigned int
/* in kHz */
unsigned int
/* in kHz */
unsigned int
/* in kHz, only needed if cpufreq
* governors are used */
unsigned int
restore_ /* = policy->cur before transition */
unsigned int
suspend_ /* freq to set during suspend */
unsigned int /* see above */
struct cpufreq_governor
* /* see below */
*governor_
governor_ /* governor start/stop flag */
struct work_ /* if update_policy() needs to be
* called, but you're in IRQ context */
struct cpufreq_real_policy
struct cpufreq_frequency_table
struct list_head
struct completion
* The rules for this semaphore:
* - Any routine that wants to read from the policy structure will
do a down_read on this semaphore.
* - Any routine that will write to the policy structure and/or may take away
the policy altogether (eg. CPU hotplug), will hold this lock in write
mode before doing so.
* Additional rules:
* - Lock should not be held across
__cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);
struct rw_
/* Synchronization for frequency transitions */
transition_ /* Tracks transition status */
spinlock_t
transition_
wait_queue_head_t
transition_
struct task_struct
*transition_ /* Task which is doing the transition */
/* For cpufreq driver's internal use */
该结构看着很复杂,现在只需要关心几个事情:
min/max frequency,调频范围,对于可以自动调频的CPU而言,只需要这两个参数就够了。
current frequency和governor,对于不能自动调频的CPU,需要governor设置具体的频率值。下面介绍一下governor。
struct cpufreq_policy不会直接对外提供API。
3) cpufreq governors
governor的概念可参考“”中相关的描述。对于不能自动调频的CPU core,必须由软件设定具体的频率值。根据使用场景的不同,会有不同的调整方案,这是由governor模块负责的,如下:
1: struct cpufreq_governor {
name[CPUFREQ_NAME_LEN];
(*governor)
(struct cpufreq_policy *policy,
unsigned int event);
(*show_setspeed)
(struct cpufreq_policy *policy,
char *buf);
(*store_setspeed)
(struct cpufreq_policy *policy,
unsigned int freq);
unsigned int max_transition_ /* HW must be able to switch to
next freq faster than this value in nano secs or we
will fallback to performance governor */
struct list_head
struct module
name,该governor的名称。
governor,用于governor状态切换的回调函数。
show_setspeed、store_setspeed,用于提供sysfs “setspeed” attribute文件的回调函数。
max_transition_latency,该governor所能容忍的最大频率切换延迟。
cpufreq governors主要向具体的governor模块提供governor的注册和注销接口,具体会在后续的文章中详细描述。
4)通过sysfs向用户空间提供的接口
请参考“linux cpufreq framework(3)_cpufreq core”。
4.3 cpufreq drivers
各个driver模块会基于cpufreq core实现具体的driver,请参考“”。
4.4 cpufreq stats
提供cpufreq有关的统计信息,请参考“”。
本文介绍了cpufreq framework的基本情况,后面通过以下的文章,分析其它内容:
,从平台驱动工程师的角度,介绍怎么编写cpufreq驱动;
,分析cpufreq的内部实现,并总结cpufreq提供的sysfs接口,介绍怎么通过sysfs,控制系统的调频行为;
,分析cpufreq governor的实现逻辑,并介绍几种常用的governor;
及HMP,认识ARM平台HMP功能。
原创文章,转发请注明出处。蜗窝科技,。Linux系统下CPU频率的调整
root@android:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_available_governors
hotplug conservative ondemand userspace powersave interactive performance
为了可以对几种常见的CPU频率调节模式有个基本的理解,下面简单的总结了一下,根据不同方式的特点,自己来在性能与省电这两对矛盾之间做个取舍,找出适合自己的平衡点吧!
1、ondemand:系统默认的超频模式,按需调节,内核提供的功能,不是很强大,但有效实现了动态频率调节,平时以低速方式运行,当系统负载提高时候自动提高频率。以这种模式运行不会因为降频造成性能降低,同时也能节约电能和降低温度。一般官方内核,还有CM7的默认的方式都是ondemand。
流畅度: 一般,流畅
2、interactive:交互模式,直接上最高频率,然后看CPU负荷慢慢降低,比较耗电。
流畅度: 最高,极流畅
Interactive 是以 CPU 排程数量而调整频率,从而实现省电。
InteractiveX 是以 CPU 负载来调整 CPU 频率,不会过度把频率调低。所以比 Interactive 反应好些,但是省电的效果一般。
3、conservative:保守模式,类似于ondemand,但调整相对较缓,想省电就用他吧。Google官方内核,kang内核默认模式。
流畅度: 高,流畅
4、smartass:聪明模式,是I和C模式的升级,该模式在比i模式不差的响应的前提下会做到了更加省电
流畅度: 最高,流畅
5、performance:性能模式!只有最高频率,从来不考虑消耗的电量,性能没得说,但是耗电量.......
流畅度:还需要说么?还有比这种模式更流畅的吗?
6、powersave 省电模式,通常以最低频率运行,打不死我也不用。
流畅度: 极低
7、userspace:用户自定义模式,系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节CPU 运行频率使用。也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置
流畅度:根据设置而定
8、Hotplug:类似于ondemand, 但是cpu会在关屏下尝试关掉一个cpu,并且带有deep sleep,比较省电。
流畅度:一般,流畅
参考:http://blog.csdn.net/myarrow/article/details/7917181
没有更多推荐了,21ic官方微信-->
imx6q cpu频率一些疑问
高级技术员, 积分 669, 距离下一级还需 331 积分
高级技术员, 积分 669, 距离下一级还需 331 积分
高级技术员, 积分 669, 距离下一级还需 331 积分
高级技术员, 积分 669, 距离下一级还需 331 积分
本帖最后由 zjwyczj 于
16:46 编辑
1.imx6q我在手册上看它的最高频率是1.0GHz,为啥网上有说是1.2GHz的,是不是又一些芯片是1.2Ghz的??
2.我想让我的cpu一直在996M的最高cpu频率工作,在linux内核配置中配置 Default CPU frequency governor (conservative)(performance),并且使用cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq查看当前的cpu频率,一会是996M,一会是396M的,这是什么原因,这个要让cpu一直在996M频率跑到底应该怎么设置?
3.我想超频,这个该怎么玩
满意回复+20
1.官网确实有1.2G的版本。
2.你这个情况是由于PMIC自动调整电压和CPU频率,处于一种比较节能的方式,轻负载,CPU频率就低,高负载,CPU频率会自动提起来。如果想 ...
初级技术员, 积分 93, 距离下一级还需 7 积分
初级技术员, 积分 93, 距离下一级还需 7 积分
初级技术员, 积分 93, 距离下一级还需 7 积分
初级技术员, 积分 93, 距离下一级还需 7 积分
1.官网确实有1.2G的版本。
2.你这个情况是由于PMIC自动调整电压和CPU频率,处于一种比较节能的方式,轻负载,CPU频率就低,高负载,CPU频率会自动提起来。如果想一直996Hz运行,方法1.修改BSP,把频率写死,方法2. 直接用 分立器件DC-DC为芯片供电,把电压调到996HZ对应的电压。通常按照方法一修改,个人建议。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
高级技术员, 积分 795, 距离下一级还需 205 积分
高级技术员, 积分 795, 距离下一级还需 205 积分
高级技术员, 积分 795, 距离下一级还需 205 积分
高级技术员, 积分 795, 距离下一级还需 205 积分
PMIC自动调整电压和CPU频率,处于一种比较节能的方式,轻负载,CPU频率就低,高负载,CPU频率会自动提起来
高级技术员, 积分 669, 距离下一级还需 331 积分
高级技术员, 积分 669, 距离下一级还需 331 积分
高级技术员, 积分 669, 距离下一级还需 331 积分
高级技术员, 积分 669, 距离下一级还需 331 积分
1.官网确实有1.2G的版本。
2.你这个情况是由于PMIC自动调整电压和CPU频率,处于一种比较节能的方式,轻负载 ...
多谢,如果要一直996M运行,在BSP中如何修改?
高级工程师, 积分 6897, 距离下一级还需 1103 积分
高级工程师, 积分 6897, 距离下一级还需 1103 积分
高级工程师, 积分 6897, 距离下一级还需 1103 积分
高级工程师, 积分 6897, 距离下一级还需 1103 积分
关注一下,期待大神帮你解决......
多谢,如果要一直996M运行,在BSP中如何修改?
如果你这里运行的是linux BSP的话,那么你可以在uboot中 boot command 设置,在Please add this in the bootargs.
&arm_freq=800&
以800Mhz为例,你可以试一下。
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
楼主我也遇到和你一样的问题,你能和我说说你是怎么解决的吗?拜托
高级工程师, 积分 6897, 距离下一级还需 1103 积分
高级工程师, 积分 6897, 距离下一级还需 1103 积分
高级工程师, 积分 6897, 距离下一级还需 1103 积分
高级工程师, 积分 6897, 距离下一级还需 1103 积分
楼主我也遇到和你一样的问题,你能和我说说你是怎么解决的吗?拜托
看你楼上的uboot参数设置......
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
多谢,如果要一直996M运行,在BSP中如何修改?
加入是android 4.4.2 ,也是在uboot中传参数?@FSL_TICS_Rita
扫描二维码,随时随地手机跟帖
涓涓之细流
发帖类勋章
时间类勋章
技术新星奖章
人才类勋章
技术导师奖章
人才类勋章
时间类勋章
坚毅之洋流
发帖类勋章
核心会员奖章
等级类勋章
您需要登录后才可以回帖
热门推荐 /6CPU一直最高频率_百度知道
CPU一直最高频率
求大神解答啊
用CPU-z查看 CPU的时钟频率一直是 最大频率啊
已经在win7电源模式里 改成了平衡 节能都没有效果
不管运没运行程序CPU都是以最高频率运行的
我前些天也用的win7系统
也是这配置 AMD X4 965 那时 改成平衡模式
或者节能模式
用CPU-Z查看
频率都是比最高频率低的
比如什么都不运行它就频率低
运行游戏时频率就高上去了
但现在换了下系统 还是win7
现在调那个选项就没效果
CPU一直是以最高频率运行!!!!
我有更好的答案
这跟系统没关系谁帮你超频的啊这是主板BIOS设置,超频的时候关闭了CPU自动节能选项导致的这样有利于超频工作稳定如果想即超频又在负载低的时候能自动降频需要打开OFFSET选项超频,要想稳定超频设置会更复杂。
超频我自己超的 我就拉了倍频而已
你这种简单的超频就会导致这种,其实也就是多耗一点点电去研究下超频攻略吧 在超频的同时如何开启睿频蛮复杂的要一步步调节,还跟你的主板BIOS有关系,这里几句话说不清楚
就是这样超啊
你看没看清楚啊
还睿频 那是英特尔的技术
我AMD X4 965黑盒的
黑盒的不锁倍频
超频直接拉倍频的
采纳率:81%
来自团队:
首先2个问题1,你又没有使用主板自带的超频软件?,或者说你有没有安装主板自带的功能软件。如果安装了,卸载他,有次我也是这样,卸载了重装就好了。2,如果没有安装,那么只要清空CMOS就可以了,具体清空办法有好几种,有些主板自带有一件清空CMOS,如果没有,那么你可以拿下主板的电池,注意要彻底断开电源,拿下电池一般2分钟左右。3,你可以选择跳线,跳线就是让主板短路,短路后CMOS也会清空。
你又不发你的配置出来给看,我估计是显卡占用高,你得换个cpu才能适配你的显卡。
怎么可能显卡占用高 HD7850
你发电脑的配置截图来看看,不发别人怎么回答你?像看医生,你不给他帮你诊断,他怎么知道你得了什么病?
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。后使用快捷导航没有帐号?
其他登录方式
—— 新手入门 ——
—— 智友精华 ——
查看: 1611|回复: 4
在线时间406 小时最后登录阅读权限30UID1075468注册时间积分758精华0
, 积分 758, 距离下一级还需 442 积分
主题帖子 金币826 元 智豆23 点
智友移动版
自从升级到4.1,耗电量大增!CPU频率永远全速,换了几个包都是这样!…有什么好的解决办法没~?
楼主很赞!赏波666
打赏排行榜
楼主共收获打赏:
虚位以待打赏
虚位以待打赏
虚位以待打赏
在线时间42 小时最后登录阅读权限15UID6516784注册时间积分80精华0
, 积分 80, 距离下一级还需 20 积分
主题帖子 金币246 元 智豆0 点
安热有省电的B503,就是里面有些广告软件不爽……
在线时间216 小时最后登录阅读权限20UID3625678注册时间积分343精华0
, 积分 343, 距离下一级还需 57 积分
主题帖子 金币511 元 智豆2 点
智友移动版
xyj9903 发表于
安热有省电的B503,就是里面有些广告软件不爽……
自行把它删除就行了
在线时间104 小时最后登录阅读权限35UID9517538注册时间积分1220精华0
, 积分 1220, 距离下一级还需 580 积分
主题帖子 金币2673 元 智豆0 点
路过,看一下。。~~~~
在线时间14 小时最后登录阅读权限10UID8389065注册时间积分24精华0
, 积分 24, 距离下一级还需 26 积分
主题帖子 金币68 元 智豆0 点
智友移动版
lbe大师里有,锁屏降低cpu
手机 笔记本 血糖仪 USB声卡 耳机

我要回帖

更多关于 linux系统怎么设置cpu频率 的文章

 

随机推荐