【原创】Linux cpufreq framework
背景
Read the fucking source code!--By 鲁迅A picture is worth a thousand words.--By 高尔基
说明:
- Kernel版本:4.14
- ARM64处理器
- 使用工具:Source Insight 3.5, Visio
1. 介绍
cpufreq子系统负责在运行时对CPU频率和电压的动态调整,以达到性能和功耗的平衡,它也叫DVFS(Dynamic Voltage Frequency Scaling)。DVFS原理:CMOS电路中功耗与电压的平方成正比,与频率也成正比。此外,频率越高,性能也越强,相应的能耗就增大了,所以Tradeoff依旧是一门艺术。cpufreq framework类似于cpuidle framework,提供机制(cpufreq driver)与策略(cpufreq governor),此外提供了cpufreq core来对机制和策略进行管理。
2. 框架
主要代码路径:
driver/cpufreq/cpufreq.c
include/linux/cpufreq.h
drivers/cpufreq/cpufreq_userspace.c
先上框架图:

粗一看与cpuidle framework的图很像,但是有些差别如下:
- 用户层与
cpufreq framework的交互,主要是通过sysfs,这个可以在/sys下看到很多文件,而Kernel Module也可以使用某些接口来回调它; - 系统只允许有一个Platform Drivers,为全局变量
cpufreq_driver,cpufreq core通过它去回调驱动; - 驱动与硬件的交互,通过如
set_clk_rate/regulator_set_voltage等接口去设置CPU的时钟和电压,而不再是cpu_ops; - 有一个全局的
governor链表cpufreq_governor_list,可以通过查找链表来选择合适的governor;
3. 数据结构
核心的数据结构有三个:
struct cpufreq_policy:用于描述不同的policy,涉及到频率表、cpuinfo等各种信息,并且每个policy都会指向某个governor;struct cpufreq_governor:用于对policy的管理;struct cpufreq_driver:用于描述具体的驱动程序;
如下图:

4. 流程
4.1 cpufreq_driver注册
仔细观察上图中struct cpufreq_driver结构体,你会发现它与传统的设备模型中的驱动结构不一致,它并没有内嵌struct bus_type或struct device_driver类型,这就决定了它不属于“device<--->bus<--->driver”这种模型。
事实上,cpufreq_driver是一个全局的变量,不属于任何一个拓扑的结构。它的注册从cpufreq_register_driver开始。
流程如下图:

4.2 governor注册
接口为:cpufreq_register_governor,这个操作实在是太简单了,添加到全局链表即可,完事!
顺带提一句吧,还有一个接口cpufreq_register_notifier,这个用于通知机制,具体不再深入分析了。
4.3 sysfs访问
cpufreq core会在/sys目录下创建相应的节点,如下图所示:

用户态可以通过cat/echo命令来读取/设置相应的值。
对应结构体如下:
static struct attribute *default_attrs[] = {
&cpuinfo_min_freq.attr,
&cpuinfo_max_freq.attr,
&cpuinfo_transition_latency.attr,
&scaling_min_freq.attr,
&scaling_max_freq.attr,
&affected_cpus.attr,
&related_cpus.attr,
&scaling_governor.attr,
&scaling_driver.attr,
&scaling_available_governors.attr,
&scaling_setspeed.attr,
NULL
};
各个字段含义如下:
affected_cpus:需要软件调整频率的cpu列表;related_cpus:需要软件或硬件来调整频率的cpu列表;cpuinfo_max_freq:CPU能够支持的最高频率(khz);cpuinfo_min_freq:CPU能够支持的最小频率(khz);cpuinfo_transition_latency:CPU频率切换时的时间开销(ns);scaling_available_governors:内核中支持的governor;scaling_driver:硬件驱动,比如cpufreq-dt;scaling_cur_freq:CPU工作频率;scaling_max_freq:当前policy的频率上限;scaling_min_freq:当前policy的频率下限;scaling_governor:CPU调频策略,可以修改;scaling_setspeed:设置CPU运行频率;
如下图:

sysfs回调下来后,会进入xxx_store/xxx_show函数来进行具体的设置,至于设置的流程大体与cpufreq_driver注册图中类似,不再深入分析了。
驱动的实现变成了实现struct cpufreq_driver函数指针中的函数,并注册即可。目前的驱动开发大抵如此,变成了一道填空题,当然我们也需要去了解背后的原理。
【原创】Linux cpufreq framework的更多相关文章
- Linux PWM framework简介和API描述【转】
本文转载自:https://blog.csdn.net/mike8825/article/details/51656400 1. 前言 PWM是Pulse Width Modulation(脉冲宽度调 ...
- Linux Regulator Framework(2)_regulator driver
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_driver.html 说实话,这篇好难懂啊... 1. 前言 本文从regulator d ...
- Linux regulator framework(1) - 概述【转】
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_framework_overview.html 1. 前言 Regulator,中文名翻译为 ...
- Linux电源管理-Linux regulator framework概述
前言 1. 什么是regulator? regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器).一般电源 ...
- [原创]Linux下网络性能测试Netperf工具介绍及安装
[原创]Linux下网络性能测试Netperf工具介绍及安装 1 官方网站 http://www.netperf.org/netperf/ 2 Netperf介绍 Netperf是一种网络性能的测试工 ...
- [转帖]Linux cpufreq 机制了解
Linux cpufreq 机制了解 https://www.cnblogs.com/armlinux/archive/2011/11/12/2396780.html 引用文章链接: http://w ...
- 【原创】Linux cpuidle framework
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- [原创]Linux-day1
原创:转发务必注明出处http://www.cnblogs.com/0zcl/p/6077298.html 一.Linux的基本原则 由目的单一的小程序组成:组合小程序完成复杂任务 一切皆文件 尽量避 ...
- (原创)linux下Microsoft/cpprestsdk支持https(server)
原创,转载请标明源地址 之前看网上一堆的资料说Microsoft/cpprestsdk不支持https或者说只支持window下的https,差点就被误导了,没办法,只好自己去翻了下源代码 先说明下l ...
随机推荐
- 小白开学Asp.Net Core 《十》
小白开学Asp.Net Core <十> — — Session.Cookie.Cache(老生常谈) 一.背景 在常谈Session和Cookie之前我们先来简单的了解下Http(可以说 ...
- Linux系统管理----磁盘管理与文件系统
1.为主机新增两块30GB的SCSI硬盘 找到要添加的虚拟机,单击鼠标右键,点击设置 点击添加 选择硬件类型,然后点击下一步 选择要创建的磁盘类型,然后点击下一步 指定要创建磁盘的容量,然后点击下一步 ...
- Spring中FactoryBean的作用和实现原理
BeanFactory与FactoryBean,相信很多刚翻看Spring源码的同学跟我一样很好奇这俩货怎么长得这么像,分别都是干啥用的.BeanFactory是Spring中Bean工厂的顶层接口, ...
- Linux基础进程管理
一.进程 了解如进程的: • PID,PPID • 当前的进程状态 • 内存的分配情况 • CPU和已花费的实际时间 • 用户UID,他决定进程的特权 (一).静态查看进程 # ps axu | le ...
- Xamarin Android 监听音量键(下)
上篇在 MainActivity 中重写了按键事件(OnKeyDown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键.返回键.菜单键等)均可通过该按键事件被捕获. 但是,按键重 ...
- 深入理解struts的运行机制
扫码关注公众号,不定期更新干活 在此申明本博文并非原创,原文:http://blog.csdn.net/lenotang/article/details/3336623,本文章是在此文章基础上进行优化 ...
- 关于修改主机名和ssh免密登录
修改主机名的常规方法: 1.hostname name2.echo name > /proc/sys/kernel/hostname3.sysctl kernel.hostname=name4 ...
- Postman系列二:Postman中get接口实战讲解(接口测试介绍,接口测试流程,头域操作)
一:接口测试介绍 接口测试:就是针对软件对外提供服务的接口输入输出进行测试,以及接口间相互逻辑的测试,验证接口功能和接口描述文档的一致性. 接口测试好处:接口测试通常能对系统测试的更为彻底,更高的保障 ...
- CodeForces 15D Map
洛谷题目页面传送门 & CodeForces题目页面传送门 题意见洛谷里的翻译.(注意翻译里有错误,应该是优先选上面的矩阵,在同一行的优先选左边的矩阵) 这题一看就会做啊 (以下设大矩阵是\( ...
- CodeForces 1129C Morse Code
洛谷题目页面传送门 & CodeForces题目页面传送门 题意见洛谷里的翻译. 首先我们可以用区间DP算出对于每个子01串,能表示的字母串的个数. 设\(dp_{i,j}\)表示长度为\(i ...