Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
reboot方式有两种:
1. 通过命令行
2. code中调用reboot().
命令行调用:
命令调用对应的源文件:
system/core/reboot/reboot.c
本质上是通过property中的sys.powerctl来触发init进程调用
property_set(ANDROID_RB_PROPERTY, “reboot”);
init.rc中有:
on property:sys.powerctl=*
powerctl ${sys.powerctl}
它会调用powerctl ioctl, 流程如下
KEYWORD(powerctl, COMMAND, 1, do_powerctl) -> //keywords.h 根据传进来的字符串转换命令。
android_reboot -> //android_reboot.c
__reboot -> //reboot.h 系统调用,陷入内核。
SYSCALL_DEFINE4 -> //kernel/sys.c
kernel_restart ->
machine_restart -> //arch/arm/kernel/process.c
arm_pm_restart ->
mdesc->restart -> //开机时在setup.c@setup_arch()中赋值
rk3288_restart //rk3288.c