首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内核的恐慌()函数是否完全冻结了所有其他进程?

问内核的恐慌()函数是否完全冻结了所有其他进程?
EN

Stack Overflow用户
提问于 2012-11-12 14:02:00
回答 1查看 8.6K关注 0票数 10

我想确认一下,内核的panic()函数和其他如kernel_halt()和machine_halt()这样的函数一旦触发,就可以保证机器完全冻结。

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

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

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

谢谢。

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

EN

回答 1

Stack Overflow用户

发布于 2012-11-16 08:43:15

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

至少对于x86体系结构来说,reboot(LINUX_REBOOT_CMD_HALT)是可行的。这反过来调用syscall 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),syscall调用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()来禁用最后一个剩余的工作处理器。此函数所做的第一件事是禁用当前处理器上的中断,即调度程序不再能够控制。

我不知道为什么syscall reboot()在调用kernel_halt()之后仍然调用kernel_halt()。我是这样解释的:现在,由于所有的处理器都被标记为禁用了,syscall 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(),这应该是重新启动处理器。

如果你有更好的洞察力,请贡献。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13345081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档