reboot和shutdown命令的函数调用梳理

reboot 命令:

SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg)  <kernel/reboot.c>
-> kernel_restart();  //对应switch中的case:LINUX_REBOOT_CMD_RESTART
		-> kmsg_dump(KMSG_DUMP_SHUTDOWN);
		-> machine_restart(cmd);    <arch/arm64/kernel/process.c>
			->arm_pm_restart(reboot_mode, cmd);
				=> arm_pm_restart = psci_sys_reset;   <drivers/firmware/psci/psci.c>   //arm_pm_restart使用PSCI模块处理。
					 -> invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);    // #define PSCI_0_2_FN_SYSTEM_RESET          PSCI_0_2_FN(9)   
														                      // #define PSCI_0_2_FN(n)	                         (PSCI_0_2_FN_BASE + (n))
														                      // #define PSCI_0_2_FN_BASE                           0x84000000
						=> invoke_psci_fn = __invoke_psci_fn_smc()
							->arm_smccc_smc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res);  //这里通过SMCCC进行管理

shutdown 命令:

SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg)  <kernel/reboot.c>
	-> kernel_power_off();  //对应switch中的case:LINUX_REBOOT_CMD_POWER_OFF
		-> kmsg_dump(KMSG_DUMP_SHUTDOWN);
		-> machine_power_off(cmd);    <arch/arm64/kernel/process.c>
			-> pm_power_off = psci_sys_poweroff;   <drivers/firmware/psci/psci.c>   //arm_pm_restart使用PSCI模块处理。
					 -> invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);    // #define PSCI_0_2_FN_SYSTEM_OFF                PSCI_0_2_FN(8)  
						=> invoke_psci_fn = __invoke_psci_fn_smc()
							->arm_smccc_smc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res);  //这里通过SMCCC进行管理

下面是common部分

#define arm_smccc_smc(...) __arm_smccc_smc(__VA_ARGS__, NULL)       <include/linux/arm-smccc.h> 

SYM_FUNC_START(__arm_smccc_smc)       <arch/arm64/kernel/smccc-call.S>
    SMCCC	smc                      //执行smc指令,进行模式切换(切换到monitor模式),陷入到EL3中
SYM_FUNC_END(__arm_smccc_smc)
EXPORT_SYMBOL(__arm_smccc_smc)
执行SMC调用,引发同步异常被cpu捕获到,=》sync_exception_aarch64 <arm-trusted-fimware/bl31/aarch64/runtime_execption.S>
		                                  -> handle_sync_execption  
									               -> smc_handler64   //跳转到x15所指定的地址-std_svc_smc_handler
                                                          -> std_svc_smc_handler   <arm-trusted-fimware/services/std_svc/std_svc_setup.c>//通过在bl31_main 中会调用runtime_svc_init来初始化el3中定义的runtime service(runtime service都是通过DECLARE_RT_SVC 这个宏来定义)
												                  -> psci_smc_handler(uint32_t smc_fid,...)   <arm-trusted-firmware/lib/psci/psci_main.c>
															              -> psci_system_off();         <arm-trusted-firmware/plat/se1000/se_pm.c>        // smc_id 匹配switch中的case:PSCI_SYSTEM_OFF   【#define PSCI_SYSTEM_OFF U(0x84000008)  与上面的PSCI_0_2_FN_SYSTEM_OFF 0x84000008对应】
															              -> psci_system_reset();      <arm-trusted-firmware/plat/se1000/se_pm.c>      // smc_id 匹配switch中的case:PSCI_SYSTEM_RESET   【#define PSCI_SYSTEM_RESET   U(0x84000009)  与上面的PSCI_0_2_FN_SYSTEM_RESET 0x84000009对应】

SMC:Secure Monitor Call 用于REE(常规执行环境)与TEE(可信执行环境)之间的数据交互,确保数据安全

ARM提出的trustzone技术,原理是将cpu的工作状态与其他相关硬件资源(中断、内存、外设和cache等)划分为安全(secure)和非安全(normal)两种类型,来达到数据隔离和保护
当cpu运行在normal状态时,将只能访问non secure空间的资源,而不能访问secure资源;
当cpu运行在secure状态时,既能访问non secure资源,也能访问secure资源。

一般称TEE为secure world,REE为normal world。<基于trustzone技术实现了TEE。OP-TEE(开源的TEE OS)运行在secure world里边,Android运行在normal world里边>
TEE特点:
1)受硬件保护机制,TEE隔离于REE,只通过特定的入口于TEE通信。
2)运行时使用CPU的全部性能
3)TEE可以访问REE的内存,REE无法访问受硬件保护的TEE内存

REE与TEE交互 =》SMC
当REE访问TEE服务时,首先需要进入到非安全区的特权模式(在Android系统中表现为linux内核态),在该模式下调用SMC,处理器进入到监视模式,监视模式下首先备份非安全区的上下文,然后进入到安全区的特权模式,此时的运行环境是安全区的执行环境TEE,并执行TEE中相应的安全服务。

参考文档:
https://zhuanlan.zhihu.com/p/353452093
http://www.wowotech.net/linux_kenrel/reboot.html
https://blog.youkuaiyun.com/dengziliang001/article/details/52173229
https://blog.youkuaiyun.com/weixin_45264425/article/details/128229055
https://blog.youkuaiyun.com/tiantao2012/article/details/72729985
https://blog.youkuaiyun.com/weixin_45264425/article/details/128229055

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值