轉自: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模式,而是正常啟動。