类android设备reset过程

模式解析流程

  • frameworks/base/core/java/android/os/PowerManager.java
  • frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
  • 把reason存储到SystemProperties,最后调用ShutdownThread带着reason传参
  • frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java
  • 这个类中主要根据一些条件做了一些单独处理,例如recovery等可能还会展示弹窗

SystemProperties.set(“sys.powerctl”, “reboot,” + reason),这里很重要

  • 静默重启会把这个值存储到内核特定的启动参数,比如使用RTC寄存器来保存,这个参数会在下次重启时被系统拿到
  • 同时,内核还会解析reason,存储另一个SystemProperties
  • 大概流程是,lk中读到RTC的quiescent标志位,则不显示开机logo,并且在cmdline中添加androidboot.quiescent = 1; lk——》kernel——》init,init会解析cmdline,并把其中的androidboot.quiescent解析出来,并设置成ro.boot.quiescent=1;这样后续android所有地方都能知道此次是静默开机

sys.powerctl

  • 平台reboot_mode寄存器配置:
    bsp/bootloader/u-boot15/arch/arm/include/asm/arch-sharkl5pro/check_reboot.h
  • Reboot mode各模式定义:
    bsp/bootloader/u-boot15/include/boot_mode.h
  • 平台各模式注册:
    bsp/bootloader/u-boot15/board/spreadtrum/ums512_1h10/ums512_1h10.c
    从寄存器或者pmic RTC中获取各模式位和进入,记录mode到cmdline
  • check_mode驱动:
    bsp/bootloader/u-boot15/drivers/misc/check_reboot.c
  • reboot时进入的模式:
    bsp/bootloader/u-boot15/common/cmd_cboot.c
  • 各模式函数代码:
    bsp/bootloader/u-boot15/common/loader/boot_mode.c

reboot流程

  • system/core/bootstat/bootstat.cpp
  • system/core/libcutils/include/cutils/android_reboot.h
  • system/core/reboot/reboot.c:
    property_set HandlePowerctlMessage DoReboot RebootSystem
  • system/core/init/reboot_utils.cpp :
    RebootSystem 通过 syscall 系统调用转到内核层
  • 由syscall到内核层之后调用的第一个函数是 SYSCALL_DEFINE4:
    第一个参数为函数名后缀,如上图,则这个定义的函数名字为SyS_reboot。
    第二个,第三个一起看,为类型加变量名。
    可以发现一共有4组类型加变量名的 变量。所以DEFINE4 中的数字4就代表SyS_reboot有4个参数
    首先对应用层中syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
    LINUX_REBOOT_CMD_RESTART2, rebootTarget.c_str());传递进来的参数进行分析,判断校验,一些reboot命令没有重启,有可能这里解析错误
  • 然后调用kerne_restart去做kernel的重启:
    bsp/kernel/kernel4.14/kernel/reboot.c
  • 这里去处理reboot原因:
    bsp/kernel/kernel5.4/drivers/spi/spi-sprd-adi.c
    sprd_adi_restart_handler
  • 这里调用do_kernel_restart做系统复位,里面做的是发送一个通知,通知各个通过register_restart_handler注册的钩子函数,执行这个关机函数,最后我发现在我系统中是使用看门狗复位来实现重启的 bsp/kernel/kernel5.4/drivers/watchdog/watchdog_core.c
  • 对watchdog函数做溢出写入触发restart

相关推荐

  1. android设备reset过程

    2024-06-14 23:28:04       27 阅读
  2. android so载入过程

    2024-06-14 23:28:04       39 阅读
  3. Android 应用启动过程

    2024-06-14 23:28:04       35 阅读
  4. Android 开机过程画面

    2024-06-14 23:28:04       32 阅读
  5. RESTful设计规范

    2024-06-14 23:28:04       61 阅读
  6. 加载过程详解

    2024-06-14 23:28:04       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 23:28:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 23:28:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 23:28:04       82 阅读
  4. Python语言-面向对象

    2024-06-14 23:28:04       91 阅读

热门阅读

  1. android 14.0 控制wifi启用禁用功能实现

    2024-06-14 23:28:04       37 阅读
  2. C Primer Plus第八章学习笔记以及编程题

    2024-06-14 23:28:04       26 阅读
  3. android OTA升级之后,apk崩溃无法启动

    2024-06-14 23:28:04       32 阅读
  4. Flask-Logging

    2024-06-14 23:28:04       33 阅读
  5. 小程序如何刷新当前页面

    2024-06-14 23:28:04       32 阅读
  6. mysql编程--创建存储过程

    2024-06-14 23:28:04       30 阅读
  7. Shell之免交互

    2024-06-14 23:28:04       26 阅读
  8. 力扣(2024.06.14)

    2024-06-14 23:28:04       33 阅读
  9. Python库

    2024-06-14 23:28:04       31 阅读
  10. 柯里化的实现

    2024-06-14 23:28:04       24 阅读
  11. (2D、3D效果)转换有哪些?

    2024-06-14 23:28:04       25 阅读
  12. OSINT技术情报精选·2024年6月第1周

    2024-06-14 23:28:04       22 阅读