linux – kernel的panic()函数是否完全冻结了其他所有进程?
我想确认内核的panic()函数和其他内容如kernel_halt()和machine_halt()一旦被触发,就可以保证机器完全冻结.
那么,所有内核和用户进程都被冻结了吗? panic()是否可以被调度程序中断?中断处理程序仍然可以执行? 使用案例:如果出现严重错误,我需要确保硬件看门狗重置机器.为此,我需要确保没有其他线程/进程使看门狗保持活跃状态??.我需要触发完全停止系统.目前,在我的内核模块中,我只是调用panic()来冻结所有内容. 另外,用户空间暂停命令可以保证冻结系统吗? 谢谢. 编辑:根据:http://linux.die.net/man/2/reboot,我认为最好的方法是使用reboot(LINUX_REBOOT_CMD_HALT):“控制权给予ROM监视器,如果有的话” 解决方法
感谢您上面的评论.经过一番研究,我准备给自己一个更完整的答案,如下:
至少对于x86架构,重启(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),系统调用调用kernel_halt()(在此定义:http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L394).该函数调用syscore_shutdown()来执行所有已注册的系统核心关闭回调,显示“System halted”消息,然后转储内核,最后,它调用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()来禁用最后剩余的工作处理器.这个函数的第一件事就是禁用当前处理器上的中断,即调度程序不再能够控制. 在调用kernel_halt()之后,我不确定为什么syscall reboot()仍然调用do_exit(0).我这样解释:现在,所有处理器都被标记为禁用,系统调用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(),它应该重启处理器. 如果您有更好的见解,请提供帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- linux – 在GNU屏幕的hardstatus中显示窗口的用户
- macos – 无法在rsync中排除.DS_store
- 如何在linux上创建虚拟CAN端口? (C )
- linux – RHEL 5附带了命令行MIME提取程序吗?
- linux – 多列终端多路复用器?
- RK3399pro Linux Rock-X AI组件库支持
- linux – 在ARM上构建mongo shell 3.2.x(armv7l / arm64 /
- linux 环境变量函数getenv()和putenv()的使用
- linux – 在docker容器中不能使用jcmd,jps或jstat cassandr
- linux – 如何在服务器上创建冗余网络