reboot流程简述
要实现这个需求,除了要知道在lk阶段和上层或者内核阶段如何读写分区,还要很清楚reboot流程
下面说一下以adb reboot recovery重启进入recovery模式说一下reboot流程
system/core/libcutils/android_reboot.cpp
int android_reboot(int cmd, int /*flags*/, const char* arg) {
ret = property_set(ANDROID_RB_PROPERTY, prop_value);
device/mediatek/mt6765/factory_init.rc
on property:sys.powerctl=*
powerctl ${sys.powerctl}
//Murphy.liu note:init.rc里面的这个条件就成立了
system/core/init/init.cpp
void property_changed(const std::string& name, const std::string& value) {
shutdown_command = value;
do_shutdown = true;
// Murphy.liu note:init程序的死循环里面
int main(int argc, char** argv) {
while (true) {
if (do_shutdown && !shutting_down) {
do_shutdown = false;
if (HandlePowerctlMessage(shutdown_command)) {
system/core/init/reboot.cpp
HandlePowerctlMessage(const std::string& command) {
} else if (cmd_params[0] == "reboot") {
DoReboot(cmd, command, reboot_target, run_fsck);
RebootSystem(cmd, rebootTarget);
case ANDROID_RB_RESTART2:
syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, rebootTarget.c_str());
// Murphy.liu note:由此就进入内核进行重启了
接下来说进入内核之后的代码分析:
kernel-4.9/kernel/reboot.c
SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,void __user *, arg)
case LINUX_REBOOT_CMD_RESTART2:
kernel_restart(buffer);
machine_restart(cmd); // Murphy.liu note:这个文件在kernel-4.9/arch/arm/kernel/reboot.c
arm_pm_restart(reboot_mode, cmd); // Murphy.liu note:arm_pm_restart是一个函数指针
接下来说说这个arm_pm_restart函数指针指向了哪里
kernel-4.9/arch/arm/kernel/setup.c
setup_arch
arm_pm_restart = mdesc->restart;
kernel-4.9/drivers/watchdog/mediatek/wdk/wd_api.c
mtk_arch_reset_init
register_restart_handler(&mtk_restart_handler); // Murphy.liu note:这里注册了一个重启处理函数
kernel-4.9/drivers/watchdog/mediatek/wdk/wd_api.c
mtk_restart_handler
arch_reset(mode, cmd);
} else if (cmd && !strcmp(cmd, "recovery")) {
rtc_mark_recovery(); // Murphy.liu note:drivers/misc/mediatek/rtc/mtk_rtc_common.c
好,reboot流程就分析到这里
reboot流程简述相关推荐
- SAP MM UB类型的退货STO流程简述
SAP MM UB类型的退货STO流程简述 SAP系统中,UB类型的采购订单(STO)用于公司内2个工厂之间的货物调拨场景.对于这个场景里的退货业务,UB类型的STO也是可以支持的.本文就是简述一下这 ...
- 常见算子使用_spark快速入门(二)spark粗略流程简述及常见名词解释
大家元旦快乐,牛年发发发~~牛气冲天o(* ̄︶ ̄*)o spark粗略流程简述 (1)有算子触发Action,Driver端和hdfs的namenode进行通信,询问元数据信息.根据元数据信息 及相应 ...
- Pacbio测序原理以及SMRT bell文库构建流程简述
2018年发的老文章了,文章不错,所以决定再捞一下.文中有3段视频,如需观看请大家移步"基因Share"观看. Pacbio测序原理及SMRT bell文库构建流程简述(二) ...
- PX4源码分析2:飞控系统控制流程简述
飞控系统控制流程简述 Created with Raphaël 2.2.0采集遥控指令,计算期望位置采集GPS数据,计算此刻实际位置计算位置差,经PID计算并输出期望角度采集IMU数据,计算此刻实际角 ...
- HDFS 读写流程简述
参考:https://blog.csdn.net/litianxiang_kaola/article/details/70984777 https://blog.csdn.net/zhanglh046 ...
- Revit二次开发(Revit2019+VS2017)-【NO.01】开发流程简述
Revit二次开发流程简述 一.软件的安装及配置 软件的下载与安装 软件的配置 配置AddInManager 配置RevitLookUp 检验是否配置成功 二.创建项目新建Visusl Studio项 ...
- 游戏公司组成架构和游戏开发流程简述
游戏公司组成架构和游戏开发流程简述 [基本概念] 游戏公司一般是指游戏开发公司或游戏发行.代理公司. 那游戏公司开发游戏需要哪些技术人员?简单的说:需要游戏造型.游戏动画.3D美工.纹理师.原画设计师 ...
- 谷歌浏览器怎样设置主页 Chrome浏览器主页设置流程简述
对大部分刚刚接触谷歌浏览器的用户来说,想要熟练地使用这款浏览器软件并不是一件轻松的事,即便是设置主页这样的小问题也很难轻易解决!那么,谷歌浏览器要怎样设置主页?下面小编就来简单介绍一下Chrome浏览 ...
- 蓝牙disable流程简述
蓝牙关闭的流程比打开流程要简单,主要就是一些profile的断连以及协议栈相关结构的释放. 这里简单说一下其流程,就直接从协议栈的disable的接口说起了. static int disable(v ...
- linux reboot流程,从命令行到内核全解析
针对对象 这篇文章我尽量写的细一些,主要针对于不太懂得嵌入式命令行到系统层过程的新手看,如果觉得有用可以关注一下,不定期写一些新手需要看的文章. 正文 引言 我们在做嵌入式设备的时候,经常会输入一些命 ...
最新文章
- iOS-仿膜拜贴纸滚动(物理仿真)
- ICML2020 | GCNII:使用初始残差和恒等映射解决过度平滑
- Chatter 导入
- Java操作控制台的命令
- 关于微信公众号小程序在运营过程中的注意事项
- php实战搭建博客,yii2项目实战-博客管理平台的搭建
- SVN 回滚(撤回)提交的代码
- strcpy ,strncpy ,strlcpy地用法
- 数据分析没价值?——深思对业务的洞察有多少?
- FreeMarker语言概述(1)
- Datagard產生gap
- 【转】【C#.NET】ASP.NET状态管理 APPlication,Session,Cookie和ViewStat用法
- C++ map, 运用map统计单词出现的次数
- php调用数据库字段代码,php读取数据库_php读取mysql所有数据库及表中字段的代码...
- 关于微信jsapi 支付签名验证失败
- 基于Filament引擎的Animoji效果实现
- 退耦电容原理--退藕电容的一般配置原则
- 领导力:刘邦的管理之道
- 力扣周赛310场题解
- cv岗工作做什么_2019 秋招 cv 岗求职心得