Android系统关机的全流程解析

2019-12-10 19:02:04刘景俊

同样的套路,也是会进行一些准备工作,之后调用machine_restart(cmd), 如果是普通重启,那么中个cmd就为NULL,如果是特殊重启,那么这个cmd就是一层一层传递下来得那个arg了。

void machine_restart(char *cmd) 
{ 
  machine_shutdown(); 
  arm_pm_restart(reboot_mode, cmd); 
} 
... 
void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart; 
EXPORT_SYMBOL_GPL(arm_pm_restart); 

而还记得刚才的pm2.c吗?在那里同样对arm_pm_restart进行了指针赋值:

arm_pm_restart = msm_pm_restart; 

赋值的函数为msm_pm_init, 其调用为

late_initcall_sync(msm_pm_init); 

late_initcall_sync的启动优先级是最低的,为7。module_init其实是6的优先级,数字越大优先级越低。所以,这样推断的话,最终arm_pm_restart这个函数指针会指向msm_pm_restart。关于msm_pm_restart的具体实现也不细看了,跟前边说的一样,都是各家不一样,就几行代码:

static void msm_pm_restart(char str, const char *cmd) 
{     
  msm_rpcrouter_close(); 
  msm_proc_comm(PCOM_RESET_CHIP, &restart_reason, 0); 
 
  for (;;) 
    ; 
}