gpt4 book ai didi

linux - 内核的 panic() 函数是否会完全卡住所有其他进程?

转载 作者:IT王子 更新时间:2023-10-29 00:19:42 27 4
gpt4 key购买 nike

我想确认内核的 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() 来执行所有已注册的系统核心关闭回调,显示“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() 来禁用最后一个剩余的工作处理器。该函数做的第一件事是禁用当前处理器上的中断,即调度程序不再能够控制。

我不确定为什么系统调用 reboot() 在调用 kernel_halt() 之后仍然调用 do_exit(0)。我是这样解释的:现在,所有处理器都标记为禁用,系统调用 reboot() 调用 do_exit(0) 并自行结束。即使调度程序被唤醒,也没有更多启用的处理器可以在其上调度某些任务,也没有中断:系统已停止。我不确定这个解释,因为 stop_this_cpu() 似乎没有返回(它进入无限循环)。 Maybe 只是一种保护措施,对于 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 - 内核的 panic() 函数是否会完全卡住所有其他进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13345081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com