转自:http://blog.csdn.net/yahoozhuo/article/details/6403140


===== 应用流程 =====
====>frameworks/base/services/java/com/android/server/MasterClearReceiver.java
RecoverySystem.rebootWipeUserData(context);

====>framesworks/base/core/java/android/os/RecoverySystem.java
rebootWipeUserData ===> bootCommand(context, "--wipe_data");
bootCommand写参数"--wipe_data"到/cache/recovery/command后,
调用pm.reboot("recovery");

====>frameworks/base/core/java/android/os/Power.java
reboot ===> rebootNative

====>frameworks/base/core/jni/android_os_Power.cpp
JNI 映射
{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
android_os_Power_reboot ===> __reboot

====>bionic/libc/arch-arm/syscalls/__reboot.S
ldr r7, =__NR_reboot // bionic/libc/include/sys/linux-syscalls.h
b __set_syscall_errno

#define __NR_reboot (__NR_SYSCALL_BASE + 88)

===== 内核流程 =====
====>kernel/arch/arm/kernel/calls.S
/* 88 */ CALL(sys_reboot)

http://blog.csdn.net/yahoozhuo/article/details/6403140


====>kernel/sys.c
sys_reboot定义在kernel/include/linux/syscalls.h,实现在kernel/kernel/sys.c

在这里,判断buffer的内容,用一个寄存器记录是否是recovery mode,以便boot loader去查询。
sys_reboot会调用kernel_restart
kernel_restart调用每一个架构特定的machine_restart, 即machine_restart执行每个架构特定的函数

====>kernel/arch/arm/kernel/process.c
machine_restart==>arm_pm_restart==>arm_machine_restart==>arch_reset

====>kernel/arch/arm/mach-tegra/include/mach/system.h
arch_reset

===== bootloader流程 =====
机器重启, 重新进入bootloader。bootloader首先会读寄存器的内容, 根据这个值决定是否进入recovery模式或者其它模式。
bootloader然后加载recovery内核。

===== recovery应用流程 =====
recovery内核中的init.rc会运行recovery

recovery应用会读取cache/recovery/command
读取参数后执行相应操作, 这里参数是--wipe_data, 放在cache/recovery/command里

把DATA和CACHE清空后重启系统,此时内核重启时写的寄存器参数RB_AUTOBOOT跟前面不同的
bionic/libc/include/sys/reboot.h
#define RB_AUTOBOOT LINUX_REBOOT_CMD_RESTART
不会再让bootloader进入recovery模式,而是正常启动。


更多相关文章

  1. RN 打包流程
  2. Android和IOS打开文档
  3. adroid
  4. android O 手机关机流程与时间
  5. Android(安卓)P按键静音流程
  6. Android(安卓)Telephony架构和流程
  7. 在android使用i2c tools访问i2c
  8. 穿针引线,帮你回忆, 汇总:Android系统启动流程 & 应用程序'进程'启
  9. MediaRecorder流程分析

随机推荐

  1. 一个mysql死锁场景实例分析
  2. Mysql慢查询优化方法及优化原则
  3. 分享几道关于MySQL索引的重点面试题
  4. CentOS7.x卸载与安装MySQL5.7的操作过程
  5. mysql中mysql-bin.000001是什么文件可以
  6. mysql提示got timeout reading communica
  7. 关于Mysql自增id的这些你可能还不知道
  8. 详解mysql集群:一主多从架构实现
  9. 浅谈MySQL中四种常用存储引擎
  10. 详解mysql5.7密码忘记解决方法