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