当前位置: 首页 > news >正文

类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

相关文章:

  • C++语法08 数据类型之间的强制转换
  • FlinkCDC 3.1.0 支持 Flink 1.18.0 版本选择
  • B树与B+树与Mysql innodb的B+树和其相关索引
  • 厂里资讯之总体架构介绍以及环境搭建
  • PostgreSQL基础(十四):PostgreSQL的数据迁移
  • IT入门知识博客文章大纲(0/10)
  • Windows 11部署FunASR离线语音识别系统
  • iOS接入Flutter
  • 带侧边栏布局:带导航的网页
  • Cask ‘oraclexxx‘ is unavailable: No Cask with this name exists.
  • 如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题
  • Python语言例题集(015)
  • 【Go语言】Go语言中的接口类型
  • C++ 进制转换
  • Android11 后台启动Activity
  • HTML中设置input等文本框为不可操作
  • Sass 快速入门教程
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • TCP拥塞控制
  • Web Storage相关
  • 对JS继承的一点思考
  • 观察者模式实现非直接耦合
  • 机器学习中为什么要做归一化normalization
  • 手机app有了短信验证码还有没必要有图片验证码?
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • (~_~)
  • (4)logging(日志模块)
  • (6)添加vue-cookie
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (PADS学习)第二章:原理图绘制 第一部分
  • (ZT)出版业改革:该死的死,该生的生
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十六)一篇文章学会Java的常用API
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET CLR基本术语
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net8.0与halcon编程环境构建
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net打印*三角形
  • .NET命令行(CLI)常用命令
  • .NET命名规范和开发约定
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @Conditional注解详解
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [ajaxupload] - 上传文件同时附件参数值
  • [Android]Tool-Systrace
  • [APIO2015]巴厘岛的雕塑
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)