我想确认的是内核的panic()
函数和其他类似kernel_halt()
和machine_halt()
一旦被触发,保证机器的完全冻结。
所以,在所有的内核和用户进程冻结? 是panic()
中断由调度? 中断处理程序仍然可以执行?
使用案例:在严重错误的情况下,我需要确保硬件看门狗复位机器。 为此,我需要确保没有其他线程/进程保持看门狗活着。 我需要触发系统的完全停止。 目前,我的内核模块里面,我只需拨打panic()
冻结一切。
此外,用户空间的halt
命令是保证冷冻系统?
谢谢。
编辑:据: http://linux.die.net/man/2/reboot ,我认为最好的方法是使用reboot(LINUX_REBOOT_CMD_HALT)
:“控制进行到ROM监控器,如果有一个”
感谢您对上述意见。 经过一番研究,我准备给自己一个更完整的答案,如下所示:
至少在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()
是应该重新启动处理器。
如果你有更好的了解,请贡献。