电源管理入门关机重启基础知识详解电源/新能源

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

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

1.2Linux内核层

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

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

关闭所有的设备--device_shutdown

关闭syscore设备--syscore_shutdown

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

禁止cpu硬件中断--local_irq_disable

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

arm_smccc_smc->SMCCCSMCCC_SMC1.3ATF层

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

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

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

1.4SCP层

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

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

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

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

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

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

运行busyboxreboot的时候,reboot—>halt_main,可知会执行halt_main()函数,在inithalt.c中

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

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

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

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

在busybox内部解析后会执行halt_reboot_pwoff()函数

halt_reboot_pwoff()分为三步:

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

发送SIGKILL给所有进程,将其杀掉

让系统重启

发送SIGTERM和SIGKILL信号给其他进程

调用子进程进行reboot系统调用:

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

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

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

调用psci接口,执行smc指令,关闭armcpu--pmm_power_off/rese->psci_sys_poweroff/reset->invoke_psci_fn->

arm_smccc_smc->SMCCCSMCCC_SMC3.1系统调用实现

其中cmd就是系统调用传进来的magic值,其他的值定义为:

reboot系统调用实现过程:

3.2内核关机函数分析

这里我们以关机poweroff命令为例,进行代码分析,重启流程相似。

3.3关闭所有设备处理

系统中所有的设备都在“/sys/devices/”目录下,这些设备是一个链表结构串起来的,devices_kset是链表头,里面都是structdevice,然后找到对应的structbus_type和structdevice_driver等,然后按照优先级例如:class>bus>driver执行对应的shutdown回调函数。

对于多CPU的机器,无论哪个CPU触发了当前的系统调用,代码都可以运行在任意的CPU上。这个接口将代码分派到一个特定的CPU上,并禁止调度器分派代码到其它CPU上。也就是说,这个接口被执行后,只有一个CPU在运行,用于完成后续的reboot动作。

3.5内核核心关闭

systemcore的shutdown和设备的shutdown类似,也是从一个链表中,遍历所有的systemcore,并调用它的shutdown接口。

3.6硬件平台的关闭

PSCI(PowerStateCoordinationInterface)电源状态协调接口,是ARM定义的电源管理接口规范。

PSCI初始化流程:

start_kernel()->setup_arch()->psci_dt_init()->psci_0_2_init()->psci_probe()->psci_0_2_set_functions()

设备树里面的信息如下里标记的版本是psci-0.2,method是使用smc。

psci_0_2_set_functions会给处理函数赋值

PSCI关机流程:

PSCI_0_2_FN_SYSTEM_OFF的值计算为:0x84000000+8,查看ARMPSCI手册:

invoke_psci_fn()在smc模式下对应__invoke_psci_fn_smc()函数:

SMCCC宏如下,smc指令触发一个安全监视器异常后,将栈上的数据存到x0~x3上,回头看__invoke_psci_fn_smc函数实际是返回x0的结果。

由于smccc_smc函数的入参有9个参数,按照约定,前4个参数存在r0-r3,其他参数从右向左入栈。

r0=a0,r1=a1,r2=a2,r3=a3,r4=a4,r5=a5,r6=a6,r7=a7

进入ATF中EL3模式执行:

smc指令是arm-v8手册中定义的一个指令,这个安全监视器触发一个异常,然后进入到EL3。EL3:安全监控异常级别。异常级别,用于执行安全监视器代码,用于处理非安全状态和安全状态之间的转换。EL3始终处于Secure状态.4.ATFBl31中的处理4.1ATF软件流程框图

BL31中smc异常触发流程图

在Linux侧调用smc异常之后,会根据中断向量表触发cpu的同步异常sync_exception_aarch64/32

然后跳转执行到handle_sync_exception->smc_handler64/32中

根据_RT_SVC_DESCS_START_+RT_SVC_DESC_HANDLE的位置,跳转执行rt_svc_desc_t结构体保存的服务std_svc_smc_handler

最后跳转到el3_exit返回Linux侧。

SMC异常触发执行流程:

进入ATF的方式触发异常:同步异常SMC、异步异常(irq,fiq)

如果是同步异常,那么一定是在linux或tee中发生了smc调用,此时进入跳转ATF中异常向量表中的同步异常程序smc_handler64或smc_handler32在该程序中,解析smcid,来选择跳转到具体哪一个rt-svc(runtimeservice)

如果是异步异常,那么一定是触发了irq或fiq或serror中断等,此时进入跳转ATF中异常向量表中的异步异常程序,进而跳转到响应的中断处理函数.

4.2内存布局bl31_entrypoint

编译使用的lds文件是arm-trusted-firmware/bl31/bl31.ld.S,开头就可以看到入口是bl31_entrypoint:

bl31_entrypoint在bl31/aarch64/bl31_entrypoint.S中定义

可以看到设置_exception_vectors为runtime_exceptions函数的:

在bl31/aarch64/runtime_exceptions.S中

同样其他宏经过转化如下:

4.3runtime服务程序初始化

bl31_entrypoint入口向下执行首先是bl31_setup,然后是bl31_main

bl31_main()函数:

runtime_svc_init()函数

RT_SVC_DECS_NUM表示svc数量

RT_SVC_DESCS_START开始的位置已经存入了结构体数据数组,因为在ld文件中进行了内存布局说明

在bl31/bl31.ld.S中:

在include/common/bl_common.ld.h中

rt_svc_descs段存放的内容是通过DECLARE_RT_SVC宏来定义的:

//其中__setion("rt_svc_descs")的意思就是注册到rt_svc_descs段中

例如在services/std_svc/std_svc_setup.c中

staticconstrt_svc_desc_t__svc_desc_std_svc服务。其服务id为SMC_TYPE_FAST<<6+OEN_STD_START,结束服务的id为SMC_TYPE_FAST<<6+OEN_STD_END

service->init()会执行std_svc_setup()函数

->psci_setup((constpsci_lib_args_t*)svc_arg)

(void)plat_setup_psci_ops((uintptr_t)lib_args->mailbox_ep,

&psci_plat_pm_ops);

plat_setup_psci_ops()的定义根据平台,我们使用的是qemu,对应plat/qemu/qemu_sbsa/sbsa_pm.c文件中:

*psci_ops=&plat_qemu_psci_pm_ops;

4.4SMC异常处理入口分析SMC命令执行后,CPU会根据异常向量表找到sync_exception_aarch64的入口

会执行handle_sync_exception,在bl31/aarch64/runtime_exceptions.S中

x30里面存储的是esr_el3的26-32位,里面是什么判断了smc64

当前平台架构是aarch64的,看一下sync_handler64这个处理,在bl31/aarch64/runtime_exceptions.S中

sync_handler64里找rt_svc_desc_t结构体类型里面的handle处理函数,而这些处理函数在rt_svc_descs节中

一个问题:怎么找到index?

例如发的一个smc消息id是0x84000000+8

bit31决定是fastcall,还是stdcall(yield对应的就是stdcall)

bit30表示是以32位传参,还是以64位传参,注意我们看了optee在linux的driver,都是以32位方式

bit29:24决定服务的类型

bit23:16reserved

bit15:0每种call类型下,表示range

这个地方值为4,

系统启动的时候会把index信息存入到rt_svc_descs_indices里面,根据4取出来就可以了。

base+index<

handler=(base+off)+(index<

w15=(__RT_SVC_DESCS_START__+RT_SVC_DESC_HANDLE)+w15<

4.5smc服务处理分析

std_svc_smc_handler()中,可以看到会调用psci_smc_handler函数。

而在psci_smc_handler函数中,就可以看到上面传入的psci传入的PSCI_SYSTEM_OFF指令

在qemu平台上的实现如下:

psci_plat_pm_ops系统初始化的时候会赋值.system_off=qemu_system_off,

semihosting_exit:

对应重启,qemu_system_reset()函数设置GPIO实现

如果不是ATF里面自己处理,有SCP,见下章节分析。5.SCP中的处理

mhu模块:mhu_isr收到中断status=smt_channel->api->signal_message(smt_channel->id);

signal_message是smt模块里面提供的,对共享内存的数据进行处理

THE END
1.电源管理TI.com.cn进一步推动电源发展http://focus.ti.com.cn/cn/analog/docs/powerhome.tsp?familyId=64&contentType=4&DCMP=TI-cn_Home_Tracking&HQS=v+OT+home_p_power
2.UEFI学习笔记(十八):ARM电源管理之SCMI内核scmi上下电接口核心空闲管理 核心的动态增删以及二级核心启动 系统关机和重置 PSCI 接口并不涉及动态电压频率调节(DVFS)或设备电源管理(如外设的管理),对于这些功能,ARM 建议使用高级配置和电源接口(ACPI)或系统控制和管理接口(SCMI)。 2、PCSA 随着行业趋势的发展,越来越多的系统开始提供微控制器来抽象化电源管理或其他系统管理任务https://blog.csdn.net/qq_44189622/article/details/143863537
3.重置bios开机慢mob6454cc770d06的技术博客在完成POST自检后,BIOS将按照系统CMOS设置中的启动顺序搜寻软盘驱动器、硬盘驱动器、光驱、网络服务器等有效的启动驱动设备,读入操作系统的引导记录,然后将系统控制权移交给引导记录,由引导记录完成操作系统的启动。 4.2:MBR GRUB第一步先找到设定的内核位置,(第一点五步 加载驱动(文件系统驱动))第二步加载内核 https://blog.51cto.com/u_16099317/12728236
4.2024年12月7日IT技术学习它可以启动各种不同的操国际快递系统作系统,包括Windows和Linux。Grub具有较高的可扩展性,可实现多层次的菜单式引导、支持多种文件系统和硬件配置等。在Linux中,Grub的作用是负责启动Linux内核,现代Linux发行版使用的是GRUB2版本。GRUB2支持多层级菜单集运系统式引导机制,它在内部使用文件系统来管理内核镜像和配置文件。http://168edu.net.cn/date/2024/12/07/
5.电脑设置多核启动后开不了机,全面设计执行方案(3)BIOS设置检查:进入BIOS设置,检查并优化与多核启动相关的设置,如CPU核心数、内存分配等。 (4)操作系统配置检查:检查操作系统配置,确保系统资源分配合理,如虚拟内存设置、电源管理等。 (5)软件检测与卸载:使用专业工具检测电脑已安装软件,找出可能与多核启动产生冲突的软件,并尝试卸载或升级。 http://www.hbpdxcl.com/post/18228.html
6.STM32内核实战经验合集1STM32/STM8单片机论坛本帖最后由 STM新闻官 于 2024-12-5 13:14 编辑 对于早期的 STM32F0xx/ STM32F1xx/ STM32F2xxhttps://bbs.21ic.com/icview-3418830-1-1.html
7.AMDZen1Zen2设备启动竟需几分钟:幸好Linux修复了amd处理器服务该问题最早由诺基亚工程师发现,他报告称多台AMD EPYC服务器启动延迟不一致,最严重时,初始解包过程比预期多花了几分钟,但并非所有启动都受影响。 调查发现,问题根源在于2023年6月的内核修改,特别是与CPU微代码更新处理相关的修改。 Zen 1和Zen 2处理器在启动过程中应用CPU微代码更新后,需要从转换旁路缓冲区(TLB)刷https://www.163.com/dy/article/JIE55JVJ0511CPVM.html
8.>第2章Solaris运行时问题当针对 Solaris 高可靠扩展版配置 x64 系统时,除超级用户以外,其他具有管理角色的用户无法在控制台上连接到 X 窗口服务器。应用程序将无法启动。不会显示任何错误消息。 解决方法:允许来自本地主机的 TCP 连接。要允许 TCP 连接,请创建/etc/X0.hosts文件,并添加带有全局区域的主机名的一行。 https://docs.oracle.com/cd/E19253-01/820-1877/6ndh3vjte/index.html
9.一文讲明白从传统服务器虚拟化云计算容器8.启用电源管理 根据集群的负载情况,如果负载低,就把所有的虚拟机迁移到一部分主机上,把剩余的主机关机,来降低功耗,当业务负载高,则自动开机,将虚拟机迁移到新开机的主机,来达到均衡。 9.开启IMC机制 就是开启Intel兼容性,使得不同批次的服务器在同一个集群中正常工作,降低高配服务器的性能 http://www.zsrm.cn/news/167314.html
10.超好用的键盘映射软件(改键器)超级好用的键盘映射工具,去除改键的烦恼,还能保存或者载入当前配置。https://www.iteye.com/resource/music3d-3636678
11.电源管理入门1关机重启详解w7.jpg电源管理入门电源管理入门-1关机重启详解:当我们接触电源管理的时候,最简单的流程就是关机重启,但是仔细分析其涉及的所有源代码就会发现,关机重启虽然简单,但是“麻雀虽小,五脏俱全”,涉及到的软件模块非常的多,涉及的流程:Linux应用(busybox)-》Linux内核-》BL31-》SCP-》PMIC/CRU等硬件。所以是一个入门学习,特别是还没接触http://news.cartech8.com/plugin.php?id=attachcenter:page&aid=549524
12.windows7操作系统教案6篇(全文)(2)BIOS读取主引导记录MBR:启动设备的首扇区 (3)Windows启动 MBR读取引导扇区的Bootmgr.exe(4)启动菜单加载核心文件和启动加载项 核心文件:smss.exe会话管理程序 service.exe服务进程 Wininit.exe启动程序 Lsass.exe 本地安全验证 / 75 练习题二:调出任务管理器认识进程并学习使用进程 https://www.99xueshu.com/w/filer0rm18po.html
13.桑系布拉德"英雄联盟"游戏问题自救排除法中文用户名的弊端,引起外国软件 / 游戏不能正常读取路径,很多数据是要保存到用户文件夹下、无法正常启动软件 / 游戏,保存设置 只能说都怪老祖宗嬴政走得太早,不然 0.0系统电源选项-快速启动 启用时,此时你的关机并不是完全关机,任务管理器,CPU正常运行时间你可以看出 https://www.haonh.com/d/36940
14.KVM系统(精雅篇)如图所示,机房的服务器通过传统的三并线以模拟信号接入到KVM控制器,KVM自带一个本地的控制台,包括一套鼠标键盘和显示器,网络管理员可以在机房本地操作和管理所控制的服务器。KVM控制器件所有接入进来的模拟信号转换成以太网上可以传输的TCP/IP报文,并接入到网络交换机,这样其他的用户可以通过连接到此网络的终端计算机https://www.360wenmi.com/f/cnkeyqrblark.html
15.电脑基础常识和必备技巧大全软件系统包括:操作系统、应用软件等。应用软件中电脑行业的管理软件, IT电脑行业 的发展必备利器,电脑行业的erp软件。 二、硬件系统 硬件系统包括:机箱(电源、硬盘、磁盘、 内存、主板、CPU-***处理器、CPU风扇、 光驱、声卡、网卡显卡).显示器、UPS(不间断电源供应系统)、键盘、鼠标等等(另可配有 http://openvpn.danzhao1.cn/show-496836.html