【问题标题】:does kernel's panic() function completely freezes every other process?内核的 panic() 函数会完全冻结所有其他进程吗?
【发布时间】:2012-11-12 14:02:00
【问题描述】:

我想确认内核的panic()函数和其他的像kernel_halt()machine_halt(),一旦被触发,保证机器完全冻结。

那么,所有内核和用户进程都被冻结了吗? panic() 是否可以被调度程序中断?中断处理程序仍然可以执行吗?

用例:如果出现严重错误,我需要确保硬件看门狗重置机器。为此,我需要确保 没有其他线程/进程 使看门狗保持活动状态。我需要触发系统完全停止。目前,在我的内核模块中,我只需调用panic() 即可冻结所有内容。

另外,用户空间的halt命令保证冻结系统?

谢谢。

编辑:根据:http://linux.die.net/man/2/reboot,我认为最好的方法是使用reboot(LINUX_REBOOT_CMD_HALT):“控制权交给ROM监视器,如果有的话”

【问题讨论】:

  • 你可以在虚拟机中试一试。
  • 如果现代 Linux 的 panic() 实现类似于 UNIX,我认为这实际上取决于机器以及抢占式调度程序的调度方式。考虑到 Linux 设计得非常好,并且通常将安全作为首要考虑因素,我很确定 panic() 会停止调度程序。

标签: linux kernel panic


【解决方案1】:

感谢上面的 cmets。经过一番研究,我准备给自己一个更完整的答案,如下:

至少对于 x86 架构,reboot(LINUX_REBOOT_CMD_HALT) 是可行的方法。这反过来又调用系统调用reboot()(参见:http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L433)。然后,对于LINUX_REBOOT_CMD_HALT 标志(参见:http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480),系统调用调用kernel_halt()(此处定义:http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L394)。该函数调用 syscore_shutdown() 来执行所有注册的系统核心关闭回调,显示“系统停止”消息,然后转储内核,最后,它调用 machine_halt(),这是 native_machine_halt() 的包装器(参见:http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/reboot.c#L680)。正是这个函数停止了其他 CPU(通过machine_shutdown()),然后调用stop_this_cpu() 来禁用最后一个剩余的工作处理器。这个函数做的第一件事是禁用当前处理器上的中断,也就是说调度程序不再能够控制。

我不知道为什么系统调用reboot() 在调用kernel_halt() 之后仍然调用do_exit(0)。我是这样解释的:现在,所有处理器都标记为禁用,系统调用reboot() 调用do_exit(0) 并自行结束。即使调度程序被唤醒,也没有更多已启用的处理器可以在其上调度某些任务,也不会中断:系统已停止。我不确定这个解释,因为stop_this_cpu() 似乎没有返回(它进入了一个无限循环)。 Maybe 只是一种保障,对于stop_this_cpu() 失败(并返回)的情况:在这种情况下,do_exit() 将干净地结束当前任务,然后调用panic() 函数。

对于panic() 代码(此处定义:http://lxr.linux.no/linux+v3.6.6/kernel/panic.c#L69),该函数首先禁用本地中断,然后通过调用smp_send_stop() 禁用除当前处理器之外的所有其他处理器。最后,作为在当前处理器(这是唯一还活着的处理器)上执行的唯一任务,所有本地中断都被禁用(也就是说,可抢占式调度程序——毕竟是一个定时器中断——没有机会......) ,然后panic()函数循环一段时间或调用emergency_restart(),这应该是重新启动处理器。

如果你有更好的见解,请贡献。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2016-04-16
    • 2012-05-12
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多