背景

  • 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. thinkphp项目阿里云ECS服务器部署

    [日记]thinkphp项目阿里云ECS服务器部署   项目本地开发告一段落.准备上传到服务器上测试 技术组成 thinkphp+mysql+阿里ECS  代码管理方式git 一.阿里ECS服务器配置 ...

  2. php上传excle文件,csv文件解析为二维数组

    解析上传的CSV文件不是什么难事,直接读取转成你想要的数组样子就OK了. public function putStoreStockIn ($filePath = '') { $file = fope ...

  3. 深入分析Elastic Search的写入过程

    摘要 之前写过一篇ElasticSearch初识之吐槽,不知觉竟然过去了两年了.哎,时光催人老啊.最近又用到了ES,想找找过去的总结文档,居然只有一篇,搞了半年的ES,遇到那么多的问题,产出只有这么点 ...

  4. 用maven工具管理web项目的错误记录:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException

    运行异常报告日志: 严重: Context initialization failedorg.springframework.beans.factory.xml.XmlBeanDefinitionSt ...

  5. T-SQL 日期

    --日期查询格式 ) --R:06/17/2011 ) --R:2011.06.17 ) --R:17/06/2011 ) --R:17.06.2011 ) --R:17-06-2011 ) --R: ...

  6. 【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署

    目录 一. 需求描述 二. 预备知识 IP+端口访问 域名访问 三. Nodejs应用的手动部署 四. 基于nodejs的自动部署 4.1 package.json中的scripts 4.2 自动化发 ...

  7. Java的自动装箱/拆箱

    概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...

  8. 自定义SWT控件五之自定义穿梭框

    5.自定义穿梭框 package com.view.control.shuttlebox; import java.util.ArrayList; import java.util.HashMap; ...

  9. 免安装版tomcat安装成服务

    安装方式(前提已经安装好了jdk,并配置了环境量): (1) 下载非exe的tomcat zip包: (2) 解压缩,如:D:\tomcat: (3) 进入D:\tomcat\bin,修改servic ...

  10. 使用Arthas 获取Spring ApplicationContext还原问题现场

    ## 背景 最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现 ``` 1#!/bin/bash 2URL="http ...