背景

  • 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. Linux网站及工具网站

    Linux官网网站 GNU官网:http://www.gnu.org/ Linux内核官网:https://www.kernel.org/ Redhat官网:https://www.redhat.co ...

  2. 【MySQL】ON DUPLICATE KEY UPDATE

    之前没用过这个操作,甚至没见过--最近接触到,而且还挺有用. 作用:若 KEY 不重复,则插入记录:否则更新记录. 单条操作: INSERT INTO table(a, b, c) VALUES (1 ...

  3. .Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)

    前言 linux 大行其道的今天想必大家都已经拥抱 core 了吧,通常的方案都是 gitlab+jenkins+centos,但是这样的方案不适合我这种懒人,一直在寻求简单的解决方案,在寻求方案的过 ...

  4. C# Winfrom 自定义控件——带图片的TextBox

    效果: 描述: 本来是想用GDI在左边画图片上去的,文本是居中对齐,如果文本是左对齐,文本会把图片遮住控件长这样: 但这样做,输入框在获取焦点时候,会把图片挡住就像这样: 输入完成之后图片就会显示完整 ...

  5. Wpf窗口设置屏幕居中最前显示

    public Window()         {             InitializeComponent();             WindowStartupLocation = Win ...

  6. java之Arrays.asList

    使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计的,但jdk1.5开始,有了另一个比 ...

  7. 微服务SpringCloud之Spring Cloud Config配置中心SVN

    在回来的路上看到一个个的都抱着花,吃了一路的狗粮,原本想着去旁边的工业园里跑跑步呢,想想还是算了,人家过七夕,俺们过巴西.上一博客学习了Spring Cloud Config使用git作为配置中心,本 ...

  8. codeforces1088D_Ehab and another another xor problem交互题

    传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...

  9. java 各基本类型转 bytes 数组

    java 将 基本类型转byte[] 数组时,需考虑大端小端问题 1. 大端格式下,基本类型与byte[]互转 BigByteUtil.java package com.ysq.util; impor ...

  10. 【作品】超实用C++分数类

    引言 我们说,编程语言的精髓在于封装,而面向对象语言完胜面向过程语言的原因就是具有更好的可封装性,而C++就是这样的一种多范型语言,常用而复杂的工作完全不必在每一份源文件中重敲,就好像我们不需要自己手 ...