26
2017
09

[RK3399][Android6.0] 系统重启调用过程小结

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

代码中直接调用:
其实和第一种差不多,只是它直接调用的是__reboot()而已。

int reboot (int  mode) 
{
    return __reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, mode, NULL );
}
上一篇:多线程使用信号量sem_init,sem_wait,sem_post 下一篇:[RK3288][Android6.0] 调试笔记 --- Camera动态热插拔支持