恢复工厂设置流程

恢复工厂设置流程

===== 应用流程 =====
packages/apps/Settings/src/com/android/settings/MasterClear.java
请求checkin服务的masterClear接口

frameworks/base/services/java/com/android/server/FallbackCheckinService.java
masterClear中调用RecoverySystem.rebootAndWipe

frameworks/base/core/java/com/android/internal/os/RecoverySystem.java
rebootAndWipe调用bootCommand("--wipe_data");

bootCommand写参数到/cache/recover/command后调用Power.reboot("recovery");

frameworks/base/core/java/android/os/Power.java
reboot实际是c接口android_os_Power_reboot

frameworks/base/core/jni/android_os_Power.cpp
对于参数reason为空的情况, 直接调用reboot(RB_AUTOBOOT);

bionic/libc/unistd/reboot.c
reboot(); 这个函数是__reboot的封装

===== 内核流程 =====
./bionic/libc/arch-arm/syscalls/__reboot.S
这个文件由gensyscalls.py自动产生,调用系统调用__NR_reboot

bionic/libc/include/sys/linux-syscalls.h
#define __NR_reboot                       (__NR_SYSCALL_BASE + 88)

./arch/arm/kernel/calls.S
__NR_reboot 就是系统函数sys_reboot

sys_reboot定义在./include/linux/syscalls.h,实现在./kernel/sys.c
sys_reboot会调用kernel_restart

kernel_restart调用每一个架构特定的machine_restart, 即machine_restart执行每个架构特定的函数

不同的硬件架构平台对reboot可能有不同的处理, 这里以G1为例
arch/arm/kernel/process.c
machine_restart执行arm_pm_restart

* 对reboot参数的处理
arch/arm/mach-msm/pm.c
msm_pm_init(void)中注册了reboot回调函数
register_reboot_notifier(&msm_reboot_notifier);

msm_reboot_notifier中.notifier_call指向msm_reboot_call

msm_reboot_call处理重启参数,对restart_reason赋值

* 对restart_reason的操作
msm_pm_init(void)中指定了arm_pm_restart的真正接口
arm_pm_restart = msm_pm_restart;

msm_pm_restart中传递restart_reason给msm_proc_comm对机器进行复位

arch/arm/mach-msm/proc_comm.c
restart_reason对应msm_proc_comm的参数data1

data1会被写入到对应寄存器中
void __iomem *base = MSM_SHARED_RAM_BASE;
writel(data1 ? *data1 : 0, base + APP_DATA1);

===== bootloader流程 =====
机器重启, 重新进入bootloader。bootloader首先会读寄存器地址base + APP_DATA1的内容, 根据这个地址的值决定是否进入recovery模式或者其它模式。bootloader还会读取MISC分区第一块的内容, 决定进入recovery模式还是升级BP或做其它事情

bootloader根据寄存器的内容, 加载recovery内核

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

recovery应用会读取misc第一块的分区内容或者/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模式,而是正常启动。

至此整个恢复工厂设置流程完毕,这只是recovery模式中的一个流程,对于recovery模式的bootloader和应用细节还很多需要讨论。

你可能感兴趣的:(恢复工厂设置流程)