1、电源管理入门之关机重启详解

目录

1. 关机重启软件流程框图

1.1 用户层

1.2 Linux内核层

1.3 ATF层

1.4 SCP层

2. Busybox中的关机重启命令

3. Linux内核中的处理

3.1 系统调用实现

3.2 内核关机函数分析

3.3 关闭所有设备处理

3.4 多CPU调度相关处理

3.5 内核核心关闭

3.6 硬件平台的关闭

3.7 内核PSCI相关操作

4. ATF Bl31中的处理

4.1 ATF 软件流程框图

4.2 内存布局bl31_entrypoint

4.3 runtime服务程序初始化

4.4 SMC异常处理入口分析

4.5 smc服务处理分析

4.5 硬件平台相关处理

5. SCP中的处理


    当我们接触电源管理的时候,最简单的流程就是关机重启,但是仔细分析其涉及的所有源代码就会发现,关机重启虽然简单,但是“麻雀虽小,五脏俱全”,涉及到的软件模块非常的多,涉及的流程:Linux应用(busybox)-》Linux内核-》BL31-》SCP-》PMIC/CRU等硬件。所以是一个入门学习,特别是还没接触过Linux内核代码的好机会,下面进入代码的海洋遨游,超级干货

1. 关机重启软件流程框图

    在Linux系统上的处理分为用户态空间、内核空间、ATFSCP四个阶段(ATF是ARM独有的,SCP在复杂SoC上才有应用)来处理:

1.1 用户层

利用rebootpoweroff等命令进行关机,在应用层会执行:

  1. 发送SIGTERM给所有进程,让进程正常退出

  2. 发送SIGKILL给所有进程,将其杀掉,并等待一段时间

  3. 调用reboot系统调用让系统关机/重启

1.2 Linux内核层

reboot系统调用会进入内核,具体流程为:

  1. reboot系统调用根据参数找到kernel_power_off/reset

  2. 向关心reboot事件的进程发送消息--blocking_notifier_call_chain

  3. 内核Kobject状态发生改变不通知用户空间--usermodehelper_disable

  4. 关闭所有的设备--device_shutdown

  5. 禁止CPU热插拔,设置当前CPU为第一个在线CPU,把新任务转移到当前CPU上--migrate_to_reboot_cpu

  6. 关闭syscore设备--syscore_shutdown

  7. 提示用户空间系统将要关闭--pr_emerg

  8. 禁止cpu硬件中断--local_irq_disable

  9. 其他cpu处于非工作状态--smp_send_stop

  10. 调用psci接口,执行smc指令,关闭arm cpu--pmm_power_off/

    rese->psci_sys_poweroff/reset->invoke_psci_fn->

    arm_smccc_smc->SMCCC SMCCC_SMC

1.3 ATF

执行SMC指令后会触发异常,进入ATF的BL31中继续执行:

  1. 进入异常向量处理的入口sync_exception_aarch64

  2. 跳转执行rt_svc_desc_t结构体保存的服务std_svc_smc_handler

  3. 执行psci相关处理。通用psci的处理函数psci_system_off和psci_system_reset,通过调用平台提供的system_off、 system_reset接口将psci消息转化为scmi消息发给SCP模块,实现最终的关机、重启。如果如果没有SCP固件的系统,会在ATF里面操作硬件寄存器进行关机重启处理。

1.4 SCP

ATF通过scim消息发送给MHU硬件并产生中断,SCP接受到中断后内部依次进行处理的模块为:

mhu-->transport-->scmi-->scmi_system_power-->power_domain-->ppu/system_power-->i2c/cru,最后SCP固件通过控制PMIC/CRU的硬件寄存器实现对系统的关机重启设置。

2. Busybox中的关机重启命令

执行关机重启的系统命令,例如shutdown/poweroff/halt/reboot/init命令

进程及服务如果提前会被正确的中止,我们就说其是安全的退出

通常关机重启命令需要管理员权限执行,所在系统目录为/sbin/*,如下为shutdown命令:

 命令格式
 [root@localhost ~]# shutdown [选项] 时间 [警告信息]
 选项:
 -c:取消已经执行的 shutdown 命令;
 -h:关机;
 -r:重启;

init命令相关执行:

 [root@localhost~]#  init 0
 #关机,也就是调用系统的 0 级别
 [root@localhost ~】# init 6
 #重启,也就是调用系统的 6 级别

现在Linux里面这些命令基本都使用busybox实现的,代码参考:

https://busybox.net/downloads/

busybox启动的时候,会注册reboot的处理信号

init\init.c中init_main函数在初始化的时候调用

   sigaddset(&G.delayed_sigset,  SIGUSR1); /* halt */
 
  sigaddset(&G.delayed_sigset, SIGTERM); /* reboot */
 
  sigaddset(&G.delayed_sigset, SIGUSR2); /* poweroff */
    
   /* Now run the looping stuff for the rest of forever */
 
    while (1) {
         /*  (Re)run the respawn/askfirst stuff */
 
        run_actions(RESPAWN |  ASKFIRST);
 
         /* Wait for any signal (typically it's SIGCHLD) */
 
        check_delayed_sigs(NULL); /* NULL timespec makes it wait */
         .....
     }

check_delayed_sigs()函数会收到reboot的信号

运行busybox reboot的时候,reboot —> halt_main,可知会执行 halt_main()函数,在init\halt.c中

static  const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM  };
 #  define RB_HALT_SYSTEM  0xcdef0123
 #  define RB_ENABLE_CAD   0x89abcdef
 #  define RB_DISABLE_CAD  0
 #  define RB_POWER_OFF    0x4321fedc
 #  define RB_AUTOBOOT     0x01234567
 
 flags = getopt32(argv,  "d:+nfwi", &delay);
 
 if (!(flags & 4)) { /* no -f */
     rc = kill(pidlist[0],  signals[which]);
 }
 else{
     rc = reboot(magic[which]);
 }

这里可以看出来,分为两个流程:

  1. 当reboot命令没有加-f的时候,直接使用kill发送信号到busybox执行halt_reboot_pwoff函数

  2. 直接使用-f的话,直接使用reboot系统调用接口,通知内核,让内核执行重启操作,简单粗暴

如果1中发送kill命令的SIGTERM 信号后,在busybox的轮询处理函数中会接收信号进行处理,如下:

static  void check_delayed_sigs(struct timespec *ts)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/260096.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用户空间与内核通信(一)

在Linux中,内核空间与用户空间是操作系统中的两个主要部分,它们有着明显的区别和不同的功能。 内核空间: 内核空间是操作系统内核运行的区域,它包括了操作系统内核代码、数据结构和设备驱动程序等。内核空间位于虚拟地址空间的最…

GptSoVits音频教程

这个号称5秒克隆,或者用1分钟音频训练10分钟就能达到原声效果。 5秒的号称,只要是,什么几秒的,大家可以完全不要想了,什么知更鸟,什么火山,包括本次的GptSoVits的效果肯定是不行的,…

gRPC 备查

简介 HTTP/2 HTTP/2 的三个概念 架构 使用流程 gRPC 的接口类型 1.单一RPC 2.服务器流式RPC 3.客户端式流式RPC 4.双向流式RPC

WordPress主题YIA在广告位添加图片广告时下方有空白怎么办?

YIA主题设置中默认有4个广告位,而侧边栏的广告位由站长自行添加。boke112百科在这些广告位添加图片广告后发现图片下方有空白,导致下方的两个角没有变圆角,看起来也有点不好看。具体如下图所示: 其实,这个问题就是典型…

【Python】【VS Code】VS Code中python.json和setting.json文件配置说明

目录 1. python.json配置 2. setting.json配置 3. 解决中文乱码 4. 实现效果 1. python.json配置 python.json 获取步骤:文件 -> 首选项 -> 配置用户代码片段 -> python 此为VS Code的头文件设置,复制以下内容到 python.json {"HEADER…

基于ant的图片上传组件封装(复制即可使用)

/*** 上传图片组件* param imgSize 图片大小限制* param data 上传数据* param disabled 是否禁用*/import React, { useState,useEffect } from react; import { Upload, Icon, message} from antd; const UploadImage ({imgSize 50,data { Directory: Image },disabled f…

Eclipse - Reset Perspective

Eclipse - Reset Perspective 1. Window -> Perspective -> Reset Perspective2. Reset Perspective -> YesReferences 1. Window -> Perspective -> Reset Perspective 2. Reset Perspective -> Yes ​​​ References [1] Yongqiang Cheng, https://yo…

AtCoder Beginner Contest 341 D - Only one of two (Java)

AtCoder Beginner Contest 341 D - Only one of two (Java) 比赛链接:AtCoder Beginner Contest 341 D题传送门AtCoder:D - Only one of two D题传送门洛谷:[ABC341D] Only one of two 题目:[ABC341D】 Only one of two 题目…

LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转

【LetMeFly】103.二叉树的锯齿形层序遍历:层序遍历 适时翻转 力扣题目链接:https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/ 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往…

Stable Diffusion WebUI 界面介绍

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 大家好,我是水滴~~ 本文主要对 Stable Diffusion WebUI 的界面进行简单的介绍,让你对该 WebUI 有个大致的了解,为后面的深入学习打下一个基础。主要内容包…

Vscode vim 插件使用Ctrl+C和V进行复制粘贴到剪切板

Vscode vim 插件使用CtrlC和V进行复制粘贴到剪切板 使用这一个插件的时候复制粘贴和其他软件互动的时候体验不好, 并且不可以用Ctrl c, Ctrl v很不爽 "vim.commandLineModeKeyBindings": [{"before" : ["Ctrl", "c"],"after&q…

LabVIEW高速信号测量与存储

LabVIEW高速信号测量与存储 介绍了LabVIEW开发的高速信号测量与存储系统,解决实验研究中信号捕获的速度和准确性问题。通过高效的数据处理和存储解决方案,本系统为用户提供了一种快速、可靠的信号测量方法。 项目背景 在科学研究和工业应用中&#xf…

爱上JVM——常见问题(一):JVM组成

1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 难易程度:☆☆☆ 出现频率:☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写&…

【4.1计算机网络】TCP-IP协议簇

目录 1.OSI七层模型2.常见协议及默认端口3.TCP与UDP的区别 1.OSI七层模型 osi七层模型: 1.应用层 2.表示层 3.会话层 4.传输层:TCP为可靠的传输层协议。 5.网络层 6.数据链路层 7.物理层 2.常见协议及默认端口 3.TCP与UDP的区别 例题1. 解析&#xff1…

XR行业首家|李未可科技通过深度合成服务算法备案

2月18日,国家网信办发布第四批深度合成服务算法备案。 根据《互联网信息服务深度合成管理规定》第十九条规定,具有舆论属性或者社会动员能力的深度合成服务提供者,应当按照《互联网信息服务算法推荐管理规定》履行备案和变更、注销备案手续。…

2.19作业

1.使用fread,fwrite完成两个文件之间的拷贝 程序代码&#xff1a; #include <myhead.h>int main(int argc, const char *argv[]) {if(argc!3){printf("input file error\n");printf("usage:./a.out srcfile destfile\n");return -1;}FILE *fpNULL;…

【JavaEE】_HTTP响应

目录 1. 首行 2. 报头header 3.空行 4. 正文body 1. 首行 响应首行&#xff1a;版本号状态码状态码描述&#xff1b; HTTP状态码描述了这次响应的结果&#xff08;比如成功、失败&#xff0c;以及失败原因等&#xff09;&#xff1b; 1. HTTP状态码有&#xff1a; &#…

华为配置旁挂二层组网隧道转发示例

配置旁挂二层组网隧道转发示例 组网图形 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 组网需求 AC组…

嵌入式学习-C++-Day6

思维导图 作业 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一…

树状数组算法模版

树状数组算法模版 树状数组算法原理基本操作模版题 树状数组算法原理 这里注意&#xff1a;C[x]的含义和lowbit()函数 基本操作 最基本的操作主要是两种 1.改变某个数&#xff08;单点修改&#xff09; 2.区间查询 模版题 #include<iostream> #include<cstdio>usin…