我是靠谱客的博主 含蓄小兔子,最近开发中收集的这篇文章主要介绍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流程简述的全部内容,希望文章能够帮你解决reboot流程简述所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部