Linux 内核';函数的panic()函数会完全冻结其他进程吗?

Linux 内核';函数的panic()函数会完全冻结其他进程吗?,linux,kernel,panic,Linux,Kernel,Panic,我想确认内核的panic()函数和其他类似kernel\u-halt()和machine\u-halt()的函数,一旦触发,将保证机器完全冻结 那么,所有的内核和用户进程都冻结了吗?调度程序是否可以中断panic()?中断处理程序仍然可以执行吗 用例:如果出现严重错误,我需要确保硬件看门狗重置机器。为此,我需要确保没有其他线程/进程让看门狗保持活动状态。我需要触发系统的完全停止。目前,在我的内核模块中,我只需调用panic()即可冻结所有内容 此外,用户空间halt命令保证冻结系统 谢谢 编辑:

我想确认内核的
panic()
函数和其他类似
kernel\u-halt()
machine\u-halt()
的函数,一旦触发,将保证机器完全冻结

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

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

此外,用户空间
halt
命令保证冻结系统

谢谢


编辑:根据:,我认为最好的方法是使用
reboot(LINUX\u reboot\u CMD\u HALT)
:“控制ROM监视器,如果有”

感谢您的评论。经过一些研究,我准备给自己一个更完整的答案,如下:

至少对于x86体系结构来说,
重新启动(LINUX\u reboot\u CMD\u HALT)
是一个不错的选择。这反过来调用syscall
reboot()
(请参阅:)。然后,对于
LINUX\u REBOOT\u CMD\u HALT
标志(请参阅:),系统调用
kernel\u HALT()
(定义如下:)。该函数调用syscore\u shutdown()以执行所有已注册的系统内核关闭回调,显示“system stopped”消息,然后转储内核,最后调用
machine\u halt()
,这是
本机\u halt()
的包装(请参阅:)。正是此函数停止其他cpu(通过
machine\u shutdown()
),然后调用
stop\u this\u cpu()
,以禁用最后剩余的工作处理器。此函数所做的第一件事是禁用当前处理器上的中断,即调度程序不再能够控制

我不知道为什么系统调用
reboot()
调用
kernel\u halt()
后仍然调用
do\u exit(0)
。我这样解释:现在,所有处理器都被标记为禁用,系统调用
reboot()
调用
do\u退出(0)
并自行结束。即使调度器被唤醒,也没有更多的已启用处理器可以在其上调度某些任务或中断:系统停止。我不确定这个解释,因为
stop\u this\u cpu()
似乎不会返回(它进入一个无限循环)。可能只是一种保护措施,当
stop\u this\u cpu()
失败(并返回)时:在这种情况下,
do\u exit()
将干净地结束当前任务,然后调用
panic()
函数

对于
panic()。最后,作为在当前处理器上执行的唯一任务(这是唯一仍处于活动状态的处理器),在禁用所有本地中断的情况下(也就是说,可抢占调度程序——毕竟是一个计时器中断——没有机会……),然后
panic()
函数会循环一段时间或调用
emergency\u restart()
,这将重新启动处理器


如果您有更好的洞察力,请参与。

您可以在虚拟机中尝试。如果现代Linux的
panic()
实现与UNIX类似,我认为这实际上取决于机器以及抢占式调度程序的调度方式。考虑到Linux设计得非常好,并且通常最关心的是安全性,我非常确定
panic()
会停止调度程序。