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

  • 相关阅读:
    isalnum()方法
    index()方法
    find()方法
    expandtabs()方法
    endswith()方法
    encode()方法
    bytes.decode()方法
    count()方法
    center()方法
    capitalize()方法
  • 原文地址:https://www.cnblogs.com/aspirs/p/14774235.html
Copyright © 2011-2022 走看看