-->

does kernel's panic() function completely free

2019-08-02 14:51发布

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

所以,在所有的内核和用户进程冻结? 是panic()中断由调度? 中断处理程序仍然可以执行?

使用案例:在严重错误的情况下,我需要确保硬件看门狗复位机器。 为此,我需要确保没有其他线程/进程保持看门狗活着。 我需要触发系统的完全停止。 目前,我的内核模块里面,我只需拨打panic()冻结一切。

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

谢谢。

编辑:据: http://linux.die.net/man/2/reboot ,我认为最好的方法是使用reboot(LINUX_REBOOT_CMD_HALT) :“控制进行到ROM监控器,如果有一个”

Answer 1:

感谢您对上述意见。 经过一番研究,我准备给自己一个更完整的答案,如下所示:

至少在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()仍然调用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()是应该重新启动处理器。

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



文章来源: does kernel's panic() function completely freezes every other process?