Android系统关机的全流程解析

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

在此函数中,首先会检测权限问题,只有超级用户才可以执行重启系统的操作:

/* We only trust the superuser with rebooting the system. */ 
if (!capable(CAP_SYS_BOOT)) 
  return -EPERM; 

否则将返回权限错误。对应的权限列表在include/linux/capability.h中,重启操作为22.
随后对magic number进行了校验:

/* For safety, we require "magic" arguments. */ 
if (magic1 != LINUX_REBOOT_MAGIC1 || 
  (magic2 != LINUX_REBOOT_MAGIC2 && 
        magic2 != LINUX_REBOOT_MAGIC2A && 
    magic2 != LINUX_REBOOT_MAGIC2B && 
        magic2 != LINUX_REBOOT_MAGIC2C)) 
  return -EINVAL; 

如果数据传输过程中没有发生错误的话,这里也当然不会有问题,所以只是一个安全性校验,基本不会发生错误。
之后有一个很有趣的检查,如果用户要求关机,而pm_power_off为空的话,就把用户的关机命令转换为挂起:

/* Instead of trying to make the power_off code look like 
 * halt when pm_power_off is not set do it the easy way. 
 */ 
if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off) 
  cmd = LINUX_REBOOT_CMD_HALT; 

在arch/arm/kernel/process.c中可以找到它的定义:

/* 
 * Function pointers to optional machine specific functions 
 */ 
void (*pm_power_off)(void); 
EXPORT_SYMBOL(pm_power_off);