内核的panic()函数是否完全冻结其他进程?

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

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

用例:在出现严重错误的情况下,我需要确保硬件看门狗重置机器。 为此,我需要确保没有其他线程/进程使看门狗活着。 我需要触发一个完整的系统暂停。 目前,在我的内核模块中,我只需调用panic()来冻结所有内容。

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

谢谢。

编辑:根据: http : reboot(LINUX_REBOOT_CMD_HALT) ,我认为最好的办法是使用reboot(LINUX_REBOOT_CMD_HALT) :“控制是给ROM监视器,如果有一个”

Solutions Collecting From Web of "内核的panic()函数是否完全冻结其他进程?"

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

至少对于x86架构来说, reboot(LINUX_REBOOT_CMD_HALT)是一个reboot(LINUX_REBOOT_CMD_HALT)选择。 这又会调用系统调用reboot() (请参阅: http : //lxr.linux.no/linux+v3.6.6/kernel/sys.c#L433 )。 然后,对于LINUX_REBOOT_CMD_HALT标志(请参阅: http : LINUX_REBOOT_CMD_HALT ),系统调用调用kernel_halt() (在此定义: http:// lxr。 linux.no/linux+v3.6.6/kernel/sys.c#L394 )。 该函数调用syscore_shutdown()来执行所有注册的系统核心关闭回调,显示“System halted”消息,然后转储内核AND,最后调用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()来禁用最后剩下的工作处理器。 这个函数做的第一件事就是禁用当前处理器上的中断,也就是说调度器不能够控制。

我不知道为什么在调用do_exit(0)之后,系统调用reboot()仍然调用do_exit(0) kernel_halt() 。 我这样解释:现在,所有处理器被标记为禁用,系统调用reboot()调用do_exit(0)并结束自身。 即使调度程序被唤醒,也没有更多的启用处理器可以调度某个任务,也不会中断:系统暂停。 我不知道这个解释,因为stop_this_cpu()似乎没有返回(它进入一个无限循环)。 对于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() ,这应该会重启处理器。

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