背景

  • Read the fucking source code! --By 鲁迅
  • A picture is worth a thousand words. --By 高尔基

说明:

  1. Kernel版本:4.14
  2. ARM64处理器
  3. 使用工具: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_drivercpufreq 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_typestruct 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的更多相关文章

  1. Linux PWM framework简介和API描述【转】

    本文转载自:https://blog.csdn.net/mike8825/article/details/51656400 1. 前言 PWM是Pulse Width Modulation(脉冲宽度调 ...

  2. Linux Regulator Framework(2)_regulator driver

    转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_driver.html 说实话,这篇好难懂啊... 1. 前言 本文从regulator d ...

  3. Linux regulator framework(1) - 概述【转】

    转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_framework_overview.html 1. 前言 Regulator,中文名翻译为 ...

  4. Linux电源管理-Linux regulator framework概述

    前言 1.  什么是regulator?      regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器).一般电源 ...

  5. [原创]Linux下网络性能测试Netperf工具介绍及安装

    [原创]Linux下网络性能测试Netperf工具介绍及安装 1 官方网站 http://www.netperf.org/netperf/ 2 Netperf介绍 Netperf是一种网络性能的测试工 ...

  6. [转帖]Linux cpufreq 机制了解

    Linux cpufreq 机制了解 https://www.cnblogs.com/armlinux/archive/2011/11/12/2396780.html 引用文章链接: http://w ...

  7. 【原创】Linux cpuidle framework

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  8. [原创]Linux-day1

    原创:转发务必注明出处http://www.cnblogs.com/0zcl/p/6077298.html 一.Linux的基本原则 由目的单一的小程序组成:组合小程序完成复杂任务 一切皆文件 尽量避 ...

  9. (原创)linux下Microsoft/cpprestsdk支持https(server)

    原创,转载请标明源地址 之前看网上一堆的资料说Microsoft/cpprestsdk不支持https或者说只支持window下的https,差点就被误导了,没办法,只好自己去翻了下源代码 先说明下l ...

随机推荐

  1. Python基础之str常用方法、for循环

    初学python,有些地方可能还不够明白,希望各位看官发现我的错误后留言指正! 一.字符串的索引与切片 注:字符串的第一位的索引值是0 1.索引案例 s = 'abcd' s1 = s[0] prin ...

  2. IDEA创建普通java和web项目教程

    1.第一个javaSE项目 01.双击idea运行IDE 02.配置JDK 03.创建项目的workspace .iml文件里面是当前项目的一些配置信息! 相当于web项目中的web.xml文件 04 ...

  3. 比特币and区块链

    比特币简介 比特币(Bitcoin:比特金)最早是一种网络虚拟货币,可以购买现实生活当中的物品.它的特点是分散化.匿名.只能在数字世界使用,不属于任何国家和金融机构,并且不受地域的限制,可以在世界上的 ...

  4. solr集群

    一.所需环境 1.linux系统(内存分大点) 2.JDK 3.zookeeper 4.solr 二.安装zookeeper 1.此次安装3个zookeeper 2.tar -zxf zookeepe ...

  5. istio使用教程

    kubernetes各版本离线安装包 安装 安装k8s 强势插播广告 三步安装,不多说 安装helm, 推荐生产环境用helm安装,可以调参 release地址 如我使用的2.9.1版本 yum in ...

  6. 【iOS】The filename 未命名.ipa in the package contains an invalid character(s)

    提交 APP 到苹果官网审核时遇到了这个问题,如图: 其实就是不支持中文,随便换个英文名就行了. 参考:http://blog.csdn.net/u011439689/article/details/ ...

  7. Could not load NIB in bundle: 'NSBundle.....

    学习NSNotification时遇到了这个问题,错误日志如下: 2015-08-28 17:47:24.617 NSNotificationDemo[7158:786614] *** Termina ...

  8. 角度转弧度&根据弧度计算圆周上点的坐标的方法

    角度转弧度: #define AngleToRadian(angle) (M_PI/180.0f)*angle 以正东面为0度起点计算指定角度所对应的圆周上的点的坐标: float radian = ...

  9. web渗透---第二天

    协议常识 HTTP协议 百度百科的解释:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. 所有的WWW文件都必须遵守这个标准. ...

  10. thinkphp3.2集成极光推送

    项目中用到了给客户端的推送功能,选用了极光推送,下面演示一下在thinkphp中集成极光推送 1.下载极光推送的php类,可以从笔者的git下载 地址:https://git.oschina.net/ ...