概述
要实现这个需求,除了要知道在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流程简述的全部内容,希望文章能够帮你解决reboot流程简述所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复