CPUFreq的核心层位于drivers/cpufreq/cpufreq,c下,它为各个SoC的CPUFreq驱动的实现提供了一套统一的接口,并实现了一套notifier机制,可以在 CPUFreq的策略和频率改变的时候向其他模块发出通知 CPUFreq核心层提供了如下API以供SoC注册自身的CPUFreq驱动: int cpufreq_register_driver(struct cpufreq_driver *driver_data ) 其参数为一个cpufreq_driver结构体指针,实际上,cpufreq_driver封装了一个具体的SoC的CPUFreq驱动的主体,该结构体形如代码如下所示。 /cpufreq/s5pv210-cpufreq.c设置name为s5pv210, drivers/cpufreq/omap-cpufreq.c设置name为omap;falgs是一些暗示性的标志,譬如 cpufreq-bench工具可以帮助工程师分析采用CPUFreq后对系统性能的影响; CPUFreq通知 CPUFreq子系统会发出通知的情况有两种:CPUFreq的策略变化或者CPU运行频率变化。
,CPUfreq核心层其实就是一个中间层,向下提供不同类型CPU驱动的框架接口(注册cpufreq_driver驱动),向上提供不同调频governor的算法接口(注册cpufreq_governor) CPUFreq 框架层 从图四的CPUFREQ软件框架图可以看出,框架层是一个虚拟中间层(cpufreq.c cpufreq_stats.c cpufreq_times.c freq_table.c提供基本函数 ,统计cpufreq相关信息),提供了承上启下的能力。 struct cpufreq_policy中各个字段变量的描述如下: 我们从一个简单的命令开始,来整体看一下CPUFREQ框架。 CPUFreq 驱动层 核心提供API cpufreq_register_driver来用于注册具体的cpufreq的驱动。
2)bL_cpufreq_register bL_cpufreq_register位于“drivers/cpufreq/arm_big_little.c”中,主要负责如下事情: a)执行一些初始化动作 b)调用cpufreq_register_driver接口,注册名称为bL_cpufreq_driver的cpufreq driver。 有关cpufreq driver以及cpufreq_register_driver的描述可参考“Linux cpufreq framework(2)_cpufreq driver”。 4)bL_cpufreq_init bL_cpufreq_driver被注册后,cpufreq core就会调用bL_cpufreq_init接口,完成后续的初始化任务,该接口比较重要,是arm big 通知,cpufreq driver会重新注册bL_cpufreq_driver。
FAQ_全志平台Tina3.0.7 RXXX cowbell方案启动时cpufreq报错且无法生成cpufreq节点 【软件版本】Tina 3.0.7 cowbell方案 【现象】 启动时报错: [ 3.434693 +0x154/0x3bc) [ 3.548616] [<c030847c>] (sunxi_cpufreq_init) from [<c0304ca4>] (cpufreq_online+0x160/0x604 ) [ 3.558112] [<c0304ca4>] (cpufreq_online) from [<c03051ac>] (cpufreq_add_dev+0x54/0x7c) [ 3.567121] ] [<c030421c>] (cpufreq_register_driver) from [<c0635c94>] (sunxi_cpufreq_initcall+0x20/0x44) [ 3.598836 ) [ 3.781820] [<c0304ca4>] (cpufreq_online) from [<c03051ac>] (cpufreq_add_dev+0x54/0x7c) [ 3.790828]
/atina/lichee/linux-4.9/drivers/cpufreq/sunxi-cpufreq.c:279: undefined reference to `arisc_dvfs_cfg_vf_table /sunxi-cpufreq.c b/drivers/cpufreq/sunxi-cpufreq.c index ff74e07..f0480a2 100644 --- a/drivers/cpufreq /sunxi-cpufreq.c +++ b/drivers/cpufreq/sunxi-cpufreq.c @@ -188,8 +188,9 @@ static int sunxi_set_cpufreq_and_voltage (struct cpufreq_frequency_table *table, memcpy((void *)kvir, (void *)cpufreq_dvfs_table, num * /cpufreq/scaling_cur_freq
linux自带的一个命令,可用来将进程绑定到指定CPU 相关的函数有: sched_setaffinity, CPU_CLR, CPU_ISSET, CPU_SET, CPU_ZERO // cpufreq 库可在/usr/lib目录下找到 // 编译: g++ -g -o x x.cpp -lcpufreq // 需要以root用户执行以下代码 //#include <cpufreq.h #ifndef _CPUFREQ_H extern "C" int cpufreq_cpu_exists(unsigned int cpu); extern "C" unsigned long cpufreq_get_freq_kernel(unsigned int cpu); extern "C" unsigned long cpufreq_get_freq_hardware (unsigned int cpu); extern "C" int cpufreq_get_hardware_limits(unsigned int cpu, unsigned long *min
# 查看某个核心详细信息 cpufreq-info -c 0 # 查看CPU当前频率 cpufreq-info -f # 查看CPU当前模式 cpufreq-info -p # 查看CPU支持的模式 cpufreq-info -g # 省电模式 cpufreq-set -g powersave # 默认模式 cpufreq-set -g ondemand # 性能模式 cpufreq-set -g performance # 单独设置CPU频率 cpufreq-set -c 0 -f 4.1GHz cpufreq-set -c 1 -f 4.1GHz cpufreq-set -c 2 -f 4.1GHz cpufreq-info 查看当前cpu状态 参数: 参数 值 说明 -c CPU序号 查看所指定cpu状态 -f 查看cpu当前频率 -l 查看cpu最高频率和最低频率 -p 查看当前cpu模式 -g 查看当前支持的CPU运行模式 -m 带单位的输出 cpufreq-set 设置cpu模式及频率 参数 值 说明 -c CPU序号 设置修改指定cpu -d 频率 设置cpu最小运行频率
修改文件 linux3.4.39/include/linux/cpufreq.h — a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h cpufreq_gov_interactive; define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_interactive) -#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_FANTASYS ) -extern struct cpufreq_governor cpufreq_gov_fantasys; -#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_fantasys ; +#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_fantasy) endif 修改kernel_menuconfig 选择 fantasy /cpufreq/scaling_min_freq 设定dvfs中最大频率的节点:/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 4.
安装: sudo apt install cpufrequtils 安装完成之后: cpufreq-aperf cpufreq-info cpufreq-set 如果要设置为性能模式: 命令是 :sudo cpufreq-set -g performance 查看CPU设置后效果: $ cpufreq-info cpufrequtils 008: cpufreq-info (C) Dominik -f 2.53Ghz cpufreq-info cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009 Report errors 该软件包主要有2个程序: /usr/bin/cpufreq-info /usr/bin/cpufreq-set 它基本上是使用Sys界面的一种用户友好的选择。 使用 cpufreq-set 命令的具体案例: 设置 CPU 的最大频率: sudo cpufreq-set -c 0 -u 2.6GHz 设置 CPU 的最小频率: sudo cpufreq-set
CPU 调频策略 CPU 调频模块主要分为 3 块: CPUFreq 框架 为所有支持CPUfreq 提供了通用的代码基础结构和用户空间API。 它定义了其他组件在其中运行的基本框架 CPUFreq Governor CPU 调频的策略。 CPU 在什么样负载,什么样的场景下应该跑多少频率,都是通过 CPUFreq Governor 采取一定策略来决定的 CPUFreq 驱动 更新CPUFreq Governor 的决定到CPU HW , 所以 cpufreq governor 完全没必要自己去做负载采样,应该从内核调度器那里获取。而基于调度器的 cpufreq governor 就是这样引出来的。 dirver ,从而完成CPUfreq的快速切换。
CPUFreq框架由3部分组成,CPUFreq Govenor、CPUFreq Core和CPUFreq Driver。 *policy); }; linux-src/drivers/cpufreq/cpufreq.c int cpufreq_register_driver(struct cpufreq_driver * 代码如下: linux-src/drivers/cpufreq/cpufreq_performance.c static struct cpufreq_governor cpufreq_gov_performance 代码如下: linux-src/drivers/cpufreq/cpufreq_powersave.c static struct cpufreq_governor cpufreq_gov_powersave ; intel_cpufreq.attr = hwp_cpufreq_attrs; intel_cpufreq.flags |= CPUFREQ_NEED_UPDATE_LIMITS
312M 240M 120M 60M 调频策略选的是userspace,就是用户想跑多少就跑多少: echo userspace > /sys/devices/system/cpu/cpu0/cpufreq /scaling_governor echo 1200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq echo 60000 > / sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq while [ ${test_count} -le ${test_count_total} /scaling_setspeed echo -e "\nSET CPU FREQ :" cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq /scaling_setspeed echo -e "\nSET CPU FREQ :" cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
有些物理服务器使用默认频率进行运行,这时可以使用该工具进行就该CPU的核心频率 安装: apt install cpufrequtils yum install cpufrequtils 使用: # 查看全部核心详细信息 cpufreq-info # 查看某个核心详细信息 cpufreq-info -c 0 # 查看CPU当前频率 cpufreq-info -f # 查看CPU当前模式 cpufreq-info -p # 查看CPU支持的模式 cpufreq-info -g # 省电模式 cpufreq-set -g powersave # 默认模式 cpufreq-set -g ondemand # 性能模式 cpufreq-set -g performance # 单独设置CPU频率 cpufreq-set -c 0 -f 4.1GHz cpufreq-set -c 1 -f 4.1GHz cpufreq-set -c 2 -f 4.1GHz ...... cpufreq-info 查看当前cpu状态 参数: 参数 值 说明 -c CPU序号 查看所指定cpu状态 -f
1、CPUFreq 驱动 CPUFreq 子系统位于 drivers/cpufreq 目录下,负责进行运行过程中 CPU 频率和电压的动态调整,即 DVFS(Dynamic Voltage Frequency CPUFreq 的核心层位于 drivers/cpufreq/cpufreq.c 下,它为各个 SoC 的 CPUFreq 驱动的实现提供了一套统一的接口,并实现了一套 notifier 机制,可以在 总而言之,系统的状态以及 CPUFreq 的策略共同决定了 CPU 频率跳变的目标,CPUFreq 核心层并将目标频率传递给底层具体 SoC 的 CPUFreq驱动,该驱动修改硬件,完成频率的变换,如图所示 用户空间一般可通过/sys/devices/system/cpu/cpux/cpufreq 节点来设置 CPUFreq。 CPUFreq 后对系统性能的影响。
1、CPUFreq 驱动 CPUFreq 子系统位于 drivers/cpufreq 目录下,负责进行运行过程中 CPU 频率和电压的动态调整,即 DVFS(Dynamic Voltage Frequency CPUFreq 的核心层位于 drivers/cpufreq/cpufreq.c 下,它为各个 SoC 的 CPUFreq 驱动的实现提供了一套统一的接口,并实现了一套 notifier 机制,可以在 总而言之,系统的状态以及 CPUFreq 的策略共同决定了 CPU 频率跳变的目标,CPUFreq 核心层并将目标频率传递给底层具体 SoC 的 CPUFreq驱动,该驱动修改硬件,完成频率的变换,如图所示 用户空间一般可通过/sys/devices/system/cpu/cpux/cpufreq 节点来设置 CPUFreq。 CPUFreq 后对系统性能的影响。
┌──[root@liruilongs.github.io]-[/usr/lib/modules/4.18.0-193.el8.x86_64/kernel/drivers/cpufreq] └─$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ┌──[root@liruilongs.github.io]-[/usr/lib/modules /4.18.0-193.el8.x86_64/kernel/drivers/cpufreq] └─$ modprobe cpufreq_ondemand ┌──[root@liruilongs.github.io /cpu/cpu0/cpufreq/scaling_governor ┌──[root@liruilongs.github.io]-[/usr/lib/modules/4.18.0-193.el8.x86 _64/kernel/drivers/cpufreq] └─$ 常见策略我们简单来看下。
+0x154/0x3bc) [ 4.084470] [<c03088ac>] (sunxi_cpufreq_init) from [<c03050d4>] (cpufreq_online +0x160/0x604) [ 4.093964] [<c03050d4>] (cpufreq_online) from [<c03055dc>] (cpufreq_add_dev +0x54/0x7c) [ 4.102971] [<c03055dc>] (cpufreq_add_dev) from [<c02218bc>] (subsys_interface_register +0x114/0x1f0) [ 4.124111] [<c030464c>] (cpufreq_register_driver) from [<c0634b84>] (sunxi_cpufreq_initcall +0x20/0x44) [ 4.134680] [<c0634b84>] (sunxi_cpufreq_initcall) from [<c0009a5c>] (do_one_initcall
Target# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq图片图2执行如下命令,修改CPU主频和主频模式。 Target# echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governorTarget# echo 1104000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeedTarget# cat /sys/devices/system/cpu/cpufreq 图片图6可通过修改"Default CPUFreq governor"选项配置CPU主频模式,本次操作修改为powersave主频模式。 Target# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freqTarget# cat /sys/devices/system/cpu
Target# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq图2执行如下命令,修改CPU主频和主频模式。 Target# echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governorTarget# echo 1104000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeedTarget# cat /sys/devices/system/cpu/cpufreq 可通过修改"Default CPUFreq governor"选项配置CPU主频模式,本次操作修改为powersave主频模式。图7配置完毕后,选中<Save>,按Enter键保存配置选项。 /cpufreq/policy0/scaling_governor设备树配置方法各主频模式最高使能主频为1.4(1.416)GHz,如需修改performance或userspace主频模式使能的主频,
cpufreq:根据cpu负载,选择满足性能需求的最低的电压/频率对(也叫OPP,Operating Performance Points)。 2. cpufreq总体框架简介 介绍完CPU电源管理的常用手段,我们简单回顾下cpufreq的总体架构和各模块的作用,以及体现的软件思想。 2.2 cpufreq软件思想介绍 cpufreq体现的一些软件设计思想,在Linux kernel中其他模块中也很常见,值得我们学习和借鉴: 分层思想。 这个函数每个policy都会执行到,可能会同时执行,产生竞争条件,最终会在cpufreq_init_governor函数中被调用。 所有共用policy都要循环执行struct sugov_cpu sg_cpu变量的初始化 调用cpufreq_add_update_util_hook接口,向scheduler注册回调函数,在cpufreq_update_util