网站查看空间商,江苏网站备案流程图,做logo的网站,南宁h5建站背景Kernel版本#xff1a;4.14ARM64处理器使用工具#xff1a;Source Insight 3.5#xff0c; Visio1. 介绍在Linux OS中#xff0c;Idle进程的运行会让CPU进入cpuidle状态。当没有其他进程处于运行状态时#xff0c;Scheduler会选择Idle进程来运行#xff0c;此时CPU无… 背景Kernel版本4.14ARM64处理器使用工具Source Insight 3.5 Visio1. 介绍在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.cdriver/cpuidle/driver.cdriver/cpuidle/governor.cdriver/cpuidle/sysfs.ckernel/shced/idle.c老规矩上图简单说明一下吧调度器发现没有Task处在运行状态时切换到Idle进程此时通过cpuidle_idle_call接口调到cpuidle frameworkcpuidle framework会选择合适的策略来决定进入哪种状态最终回调到底层的平台实现。SMP处理器都有cpuidle状态而各个状态下的功耗都不同是否进入cpuidle状态有两个重要的参考因素CPU进入-退出cpuidle状态的latencyCPU处在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 numberlast_residency该cpu核上一次停留在cpuidle状态的时间usstate_countcpuidle状态的个数states_usagestruct cpuidle_state_usage数组记录每个cpuidle状态的统计信息包括是否使能、进入该cpuidle状态的次数停留在该cpuidle状态的总时间uskobjs*与sysfs组织相关开发给用户层来操作底层-device_list全局链表链接到cpuidle_detected_device上3.2 cpuidle drivercpuidle driver用于驱动一个或多个CPU核关键字段描述如下bctimer用于驱动注册时判断是否需要设置broadcast timerstates[]struct cpuidle_state数组用于描述cpuidle的状态需要按照功耗从大到小来排序具体有多少个cpuidle状态取决于device Tree中的定义默认已经有state[0]如上图所示。cpumask用于表明支持哪些CPU核struct cpuidle_state中的enter函数是最终进入cpuidle状态的函数。不同处理器的cpuidle驱动实现主要是填充state结构体。3.3 cpuidle governorgovernor结构主要提供不同的回调函数最终由menu_governor填充主要字段如下enable/disable在设备驱动注册和注销的时候调用select根据已有状态来选择一个cpuidle状态reflect调用该接口告知governorCPU上一次所处的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的注释主要有三个决定因素功耗平衡点也就是需要权衡考虑cpuidle状态带来的功耗节省和在该cpuidle状态下的停留时间假如停留时间太短小于target_residency则不划算。性能影响那些具有大的延迟退出exit_latency的cpuidle state通常会对工作负载产生较大影响这个对系统管理员来说是不可接受的。此外低性能往往也意味着低功耗。延迟容忍度从pmqos框架获取在满足延迟容忍度latency_req的条件下选择功耗最小的cpuidle状态。具体的策略不再分析请直接看driver/cpuilde/menu.c代码及注释。 推荐阅读 专辑|Linux文章汇总 专辑|程序人生 专辑|C语言嵌入式Linux微信扫描二维码关注我的公众号