0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CPU进入idle进程状态的流程

Linux阅码场 来源:人人都是极客 作者:布道师Peter 2022-10-14 09:26 次阅读

cpuidle framework

每一个 CPU 核心都会有一个 idle 进程,idle 进程是当系统没有调度 CPU 资源的时候,会进入 idle 进程,而 idle 进程的作用就是不使用 CPU,以此达到省电的目的。

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

cpuidle core 是 cpuidle framework 的核心模块,负责抽象出 cpuidle device、cpuidle driver 和 cpuidle governor 三个实体,如下所示:

88ab3e4e-4b55-11ed-a3b6-dac502259ad0.png

cpuidle core 抽象出了 cpuidle device、cpuidle driver 和 cpuidle governor 三个数据结构。

数据结构

cpuidle_device

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

structcpuidle_device{
//该cpu核是否注册进内核中
unsignedintregistered:1;
//该cpu核是否已经使能
unsignedintenabled:1;
unsignedintuse_deepest_state:1;
//对应的cpunumber
unsignedintcpu;

//该cpu核上一次停留在cpuidle状态的时间(us)
intlast_residency;
//记录每个cpuidle状态的统计信息,包括是否使能、进入该cpuidle状态的次数,停留在该cpuidle状态的总时间(us)
structcpuidle_state_usagestates_usage[CPUIDLE_STATE_MAX];
......
};

对应的注册接口是 cpuidle_register_device。

cpuidle_driver

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

structcpuidle_driver{
constchar*name;
structmodule*owner;
intrefcnt;

//用于驱动注册时判断是否需要设置broadcasttimer
unsignedintbctimer:1;
//用于描述cpuidle的状态,需要按照功耗从大到小来排序,具体有多少个cpuidle状态
structcpuidle_statestates[CPUIDLE_STATE_MAX];
......
};

//CPU有多种不同的idle级别。这些idle级别有不同的功耗和延迟,从而可以在不同的场景下使用
//主要包括exit_latency、power_usage、target_residency。这些特性是governor制定idle策略的依据
structcpuidle_state{
charname[CPUIDLE_NAME_LEN];
chardesc[CPUIDLE_DESC_LEN];

unsignedintflags;
//CPU从该idle state下返回运行状态的延迟,单位为us。它决定了CPU在idle状态和run状态之间切换的效率,如果延迟过大,将会影响系统性能;
unsignedintexit_latency;/*inUS*/
//CPU在该idlestate下的功耗,单位为mW
intpower_usage;/*inmW*/
//期望的停留时间,单位为us。进入和退出idle state是需要消耗额外的能量的,如果在idle状态停留的时间过短,节省的功耗少于额外的消耗,则得不偿失。governor会根据该字段,结合当前的系统情况(如可以idle多久),选择idle level;
unsignedinttarget_residency;/*inUS*/
booldisabled;/*disabledonallCPUs*/

//进入该state的回调函数
int(*enter)(structcpuidle_device*dev,
structcpuidle_driver*drv,
intindex);

//CPU长时间不需要工作时(称作offline),可调用该回调函数。
int(*enter_dead)(structcpuidle_device*dev,intindex);
......
};

对应的注册接口是 cpuidle_register_driver。

cpuidle_governor

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

structcpuidle_governor{
charname[CPUIDLE_NAME_LEN];
structlist_headgovernor_list;
//governor的级别,正常情况下,kernel会选择系统中rating值最大的governor作为当前governor
unsignedintrating;

//在设备驱动注册和注销的时候调用
int(*enable)(structcpuidle_driver*drv,
structcpuidle_device*dev);
void(*disable)(structcpuidle_driver*drv,
structcpuidle_device*dev);

//根据当前系统的运行状况,以及各个idlestate的特性,选择一个state(即决策)
int(*select)(structcpuidle_driver*drv,
structcpuidle_device*dev,
bool*stop_tick);
//通过该回调函数,可以告知governor,系统上一次所处的idlestate是哪个
void(*reflect)(structcpuidle_device*dev,intindex);
};

对应的注册接口是 cpuidle_register_governor。

流程

我们先看下设备和驱动的注册过程:

88d8a2f8-4b55-11ed-a3b6-dac502259ad0.png

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

下面看下 CPU 进入 idle 状态的流程图:

88ea354a-4b55-11ed-a3b6-dac502259ad0.png

可以看出,最终是通过 PSCI 来实现 CPU 的 suspend。

PSCI

PSCI, Power State Coordination Interface,由ARM定义的电源管理接口规范,通常由Firmware来实现,而Linux系统可以通过smc/hvc指令来进入不同的Exception Level,进而调用对应的实现。

88ffd206-4b55-11ed-a3b6-dac502259ad0.png

PSCI 支持如下功能:

CPU hotplug (on/off)

CPU idle (suspend/resume)

System suspend/resume

System shutdown and reset

每个功能和ATF之间的调用接口如下所示:

892f577e-4b55-11ed-a3b6-dac502259ad0.png89970bee-4b55-11ed-a3b6-dac502259ad0.png




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9040

    浏览量

    366726
  • 电源管理
    +关注

    关注

    115

    文章

    6154

    浏览量

    144202
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211088

原文标题:CPU 进入 IDLE 都做了啥?

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux进程怎么绑定CPU

    昨天在群里有朋友问:把进程绑定到某个 CPU 上运行是怎么实现的。
    发表于 10-26 10:26 1842次阅读

    电源管理入门-CPU Idle有什么用?Idle状态判断

    答案就是“省电”,当多核CPU没有任务执行的时候,这时候需要将除主Core之外的其他Core进行低功耗处理,这件事就是CPU Idle机制做的。
    的头像 发表于 11-16 16:46 7247次阅读
    电源管理入门-<b class='flag-5'>CPU</b> <b class='flag-5'>Idle</b>有什么用?<b class='flag-5'>Idle</b><b class='flag-5'>状态</b>判断

    【Linux学习杂谈】之进程状态

    正在运行,也就是就绪态的进程进入运行的一个状态,得到CPU的执行权限3.僵尸态 僵尸态就是进程结束了,但是相应的资源没有被父
    发表于 09-27 00:36

    关于CC1101的WOR问题,请问SLLEP状态下想切换进入WOR,是要先进入IDLE,然后延时发送sworrs以及swor指令吗?

    )时间后,开始进行event1,标定,发送;还是说直接就开始event1,标定,发送,然后再进入SLEEP?2、SLLEP状态下想切换进入WOR,是要先进入
    发表于 06-06 06:37

    CPU调度的概念及问题解决

    1.1 cpu调度 其任务是控制、协调进程cpu的竞争,即按一定的调度算法从就绪队列中选择一个进程,把cpu的使用权交给被选中的
    发表于 08-05 06:42

    请问低功耗IDLE模式的唤醒如何做到几个毫秒唤醒一次继而再次进入该模式?

    资料中说:IDLE模式下,将CPU 置于低功耗模式。可有选择性地关闭外设时钟并且只有那些在IDLE 期间需要运行的外设保持运行状态。来自激活外设或者安全装置定时器的已启用的中断将把处理
    发表于 05-12 09:13

    进程有几种状态

    文章目录操作系统进程和线程什么是进程?什么是线程?进程和线程有什么区别?何时使用多进程,何时使用多线程?进程有几种
    发表于 12-24 07:16

    Linux 进程状态浅析

    系统调用)、或TASK_DEAD状态(如exit系统调用);或由于执行系统调用需要的资源得不到满足,而进入TASK_INTERRUPTIBLE状态或TASK_UNINTERRUPTIBLE状态
    发表于 04-02 14:40 283次阅读

    CPU核心中idle进程作用

    每一个 CPU 核心都会有一个 idle 进程idle 进程是当系统没有调度 CPU 资源的时
    的头像 发表于 10-14 09:28 1907次阅读

    进程有哪些状态?细说进程状态

    进程有哪些状态?这个问题在面试的时候出现的概率也比较高。
    的头像 发表于 07-25 17:06 1262次阅读
    <b class='flag-5'>进程</b>有哪些<b class='flag-5'>状态</b>?细说<b class='flag-5'>进程</b>的<b class='flag-5'>状态</b>

    如何在connected idle状态下向手机同步音量

    在QCC517x/QCC518x新的ADK下,headset工程如果有音量加减事件,只有当前有A2DP播放音乐或者HFP通话状态下才会给手机发送事件,否则程序会忽略音量加减事件。本文介绍如何在connected idle状态下向
    的头像 发表于 10-20 12:22 693次阅读
    如何在connected <b class='flag-5'>idle</b><b class='flag-5'>状态</b>下向手机同步音量

    进程进入等待状态有哪几种方式

    进程进入等待状态的方式有多种,下面将详细介绍。 一、阻塞等待状态 阻塞等待状态是指进程由于某些原
    的头像 发表于 11-17 11:19 2096次阅读

    python自带的idle怎么进入

    详细介绍Python的IDLE的各个方面,包括如何进入IDLEIDLE的功能和特点以及如何使用IDLE进行编程和调试等。 首先,
    的头像 发表于 11-29 14:51 2173次阅读

    如何在内核中启动secondary cpu

    给调度器之前,并没有实际的业务进程,而我们知道内核中cpu在空闲时会执行idle进程。因此,在其启动之前需要为每个cpu初始化一个
    的头像 发表于 12-05 15:46 541次阅读
    如何在内核中启动secondary <b class='flag-5'>cpu</b>

    secondary cpu执行流程介绍

    : 由于其底层相关初始化流程与primary cpu类似,因此此处不再介绍。我们这里主要看一下它是如何通过secondary_start_kernel启动idle线程的: asmlinkage
    的头像 发表于 12-05 16:12 784次阅读
    secondary <b class='flag-5'>cpu</b>执行<b class='flag-5'>流程</b>介绍