zoukankan      html  css  js  c++  java
  • 内核reboot流程

    内核reboot流程

    kernel/reboot.c

    void kernel_restart(char *cmd)
    {
            kernel_restart_prepare(cmd);
            migrate_to_reboot_cpu();
            syscore_shutdown();
            if (!cmd)
                    pr_emerg("Restarting system
    ");
            else
                    pr_emerg("Restarting system with command '%s'
    ", cmd);
            kmsg_dump(KMSG_DUMP_RESTART);
            machine_restart(cmd);
    }

    ->reboot命令

    ->glibc给所有任务发送kill

    ->内核态kernel_restart()

    ->kernel_restart_prepare()

    ->device_shutdown()

    -> dev->driver->shutdown() 调用驱动注册的.shutdown钩子

    ->migrate_to_reboot_cpu() 关闭cpu hotplug

    ->syscore_shutdown() 里面ops->shutdown,内核相关子系统(比如clk,irq,pm)注册的shutdown

    ->machine_restart

    ->local_irq_disable(); smp_send_stop(); /* Disable interrupts first */

    -> 根据 arm_pm_restart是否初始化决定走arm_pm_restart(reboot_mode, cmd),如果是这种case,一般会写pm register将whole cpu reset;或 do_kernel_restart(cmd);

    ->do_kernel_restart() 执行注册的restart_handler_list

    ->BIOS->ATF->芯片复位

    from: https://zhuanlan.zhihu.com/p/353452093

  • 相关阅读:
    webpack打包(2)
    webpack打包(1)
    angular(5自定义模块和ionic创建)
    angular(4)路由及其使用
    anjular(3 生命函数及请求)
    Angular(2)
    自学Angular(1)
    Typescript知识总结
    PLC数据采集与MES系统对接
    python格式化日期时间自动补0
  • 原文地址:https://www.cnblogs.com/aspirs/p/14774235.html
Copyright © 2011-2022 走看看