背景

  • 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. 介绍

在Linux OS中,Idle进程的运行会让CPU进入cpuidle状态。当没有其他进程处于运行状态时,Scheduler会选择Idle进程来运行,此时CPU无所事事。

在ARM64架构中,当CPU Idle时,会调用WFI指令(wait for interrupt),关掉CPU的Clock以便降低功耗,当有外设中断触发时,CPU又会恢复回来。

cpuidle framework就是用来向上给Scheduler/Sysfs提供使用接口,向下用来对接不同架构的处理器,凡是框架基本都大同小异,屏蔽硬件层并抽象使用接口。

相信你已经猜到了,cpuidle和电源管理相关。

2. 框架

代码路径:
driver/cpuidle/cpuidle.c
driver/cpuidle/driver.c
driver/cpuidle/governor.c
driver/cpuidle/sysfs.c
kernel/shced/idle.c

老规矩,上图:

简单说明一下吧:调度器发现没有Task处在运行状态时,切换到Idle进程,此时通过cpuidle_idle_call接口调到cpuidle frameworkcpuidle framework会选择合适的策略来决定进入哪种状态,最终回调到底层的平台实现。

SMP处理器都有cpuidle状态,而各个状态下的功耗都不同,是否进入cpuidle状态有两个重要的参考因素:

  • CPU进入-退出cpuidle状态的latency;
  • CPU处在cpuidle状态的功耗;

Latency和功耗的tradeoff,是需要根据实际情况来选择策略的,也就是Governor的作用。

3. 数据结构

cpuidle core抽象出了三个数据结构:

  • cpuidle device:用于描述CPU核;
  • cpuidle driver: 针对CPU核的驱动;
  • cpuidle governor:主要根据cpuidle的device和driver状态来选择策略;

图如下:

3.1 cpuidle device

针对每个CPU核都对应一个struct cpuidle_device结构,主要字段介绍如下:

  • registered:该cpu核是否注册进内核中;
  • enabled:该cpu核是否已经使能;
  • cpu:对应的cpu number;
  • last_residency:该cpu核上一次停留在cpuidle状态的时间(us);
  • state_count:cpuidle状态的个数;
  • states_usagestruct cpuidle_state_usage数组,记录每个cpuidle状态的统计信息,包括是否使能、进入该cpuidle状态的次数,停留在该cpuidle状态的总时间(us);
  • kobjs*:与sysfs组织相关,开发给用户层来操作底层;
  • device_list:全局链表,链接到cpuidle_detected_device上;

3.2 cpuidle driver

cpuidle driver用于驱动一个或多个CPU核,关键字段描述如下:

  • bctimer:用于驱动注册时判断是否需要设置broadcast timer;
  • states[]struct cpuidle_state数组,用于描述cpuidle的状态,需要按照功耗从大到小来排序,具体有多少个cpuidle状态,取决于device Tree中的定义,默认已经有state[0],如上图所示。
  • cpumask:用于表明支持哪些CPU核;

struct cpuidle_state中的enter函数,是最终进入cpuidle状态的函数。不同处理器的cpuidle驱动实现,主要是填充state结构体。

3.3 cpuidle governor

governor结构主要提供不同的回调函数,最终由menu_governor填充,主要字段如下:

  • enable/disable:在设备驱动注册和注销的时候调用;
  • select:根据已有状态来选择一个cpuidle状态;
  • reflect:调用该接口告知governor,CPU上一次所处的cpuidle状态是哪个;

流程

cpuidle-arm.c为例,整个注册流程如下图:

注册之后便将设备和驱动建立起连接关系了,最终cpuidle framework的用户便可通过接口来调用下层的接口,进而完成具体的硬件操作。

Idle Task通过cpuidle_enter为入口,调用到cpuidle_framework,流程如下图:

Idle Task调用cpuidle_enter之前,需要先通过governor来运用策略来选择将要进入的cpuidle state。入口为cpuidle_select,当完成状态切换后会调用cpuidle_reflect来将信息更新到governor。具体的图如下:

其中Governor关于状态的策略选择,可以参考menu.c的注释,主要有三个决定因素:

  1. 功耗平衡点,也就是需要权衡考虑cpuidle状态带来的功耗节省和在该cpuidle状态下的停留时间,假如停留时间太短(小于target_residency),则不划算。
  2. 性能影响,那些具有大的延迟退出(exit_latency)的cpuidle state,通常会对工作负载产生较大影响,这个对系统管理员来说是不可接受的。此外,低性能往往也意味着低功耗。
  3. 延迟容忍度(从pmqos框架获取),在满足延迟容忍度latency_req的条件下,选择功耗最小的cpuidle状态。

具体的策略不再分析,请直接看driver/cpuilde/menu.c代码及注释。

【原创】Linux cpuidle framework的更多相关文章

  1. 【原创】Linux cpufreq framework

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

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

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

  3. Linux Regulator Framework(2)_regulator driver

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

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

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

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

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

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

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

  7. [原创]Linux-day1

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

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

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

  9. Linux Thermal Framework分析及实施

    关键词:Zone.Cooling.Governor.Step Wise.Fair Share.trip等等. Linux Thermal的目的是控制系统运行过程中采样点温度,避免温度过高造成器件损坏, ...

随机推荐

  1. Java中使用 foreach 操作数组

    foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是" for 每一个& ...

  2. DedeCMS自定义表单制作和调用办法

    [摘要]在很多建站需求中,需要一些额外的表单供前台用户提交,以便于收集.统计.分析及处理更多的数据,利用DedeCMS自带提供的自定义表单功能即可满足大多数的此类需求,本文就讲一下如何使用DedeCM ...

  3. java练习---14

    abstract class A{ private String name; public A(String name) { this.name = name; } public String get ...

  4. MyBatis在Spring环境下的事务管理

    MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能.但是由于它本身也有一些缓存.事务管理等功能,所以实际使用中还是会碰到一些问题--另外,最近接触了JFin ...

  5. 【Android Studio】查看源码时提示“throw new RuntimeException("Stub!")”

    如题-- 详细问题及解决方法: http://blog.csdn.net/u010917495/article/details/51234179

  6. Windows下安装python2与python3以及分别对应的virtualenv

    第三次装python2与python3 除此之外还学会了如何在命令行复制代码1.单击右键2.菜单中选择标记3.按住左键选中需要复制的内容4.松开左键5.单击右键 全局中python版本为python2 ...

  7. host配置

    host添加地址 今天是我第一天入职,坐到工位的第一件事就是配置host,因为连接测试环境需要本地授权,所以要配置.这里简单记录下配置中遇到的问题和操作的步骤 操作环境是win10,之前公司一直使用的 ...

  8. 初识Apache NiFi

    一. NiFi介绍 Apache NiFi支持功能强大且可扩展的数据路由,转换和系统中介逻辑的有向图. Apache NiFi的一些高级功能和目标包括: 基于Web的用户界面 设计,控制,反馈和监控之 ...

  9. 快速字符串匹配一: 看毛片算法(KMP)

    前言 由于需要做一个快速匹配敏感关键词的服务,为了提供一个高效,准确,低能耗的关键词匹配服务,我进行了漫长的探索.这里把过程记录成系列博客,供大家参考. 在一开始,接收到快速敏感词匹配时,我就想到了 ...

  10. 【JDK】JDK源码分析-CountDownLatch

    概述 CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行. 简单起见,可以把它理解为一个倒数的计数器:初始值为线程 ...