我在远程位置安装了ARM板。有一段时间我有一个内核恐慌错误。同时,硬件重启没有选择。公共汽车上没有人可以重新启动它。
我想在内核崩溃错误后自动重启我的主板。那么在内核中该怎么做
答案 0 :(得分:2)
如果您的硬件包含watchdog timer,则使用看门狗支持编译内核并进行配置。我建议关注此博客http://www.jann.cc/2013/02/02/linux_watchdog.html
警告 ::我从未尝试过这个。如果问题已解决,请在此处更新。
答案 1 :(得分:2)
您可以修改panic()函数kernel / panic.c以在您希望它重新启动的位置调用kernel_restart(* cmd)(可能在打印所需的调试信息之后)。
我假设你正在提出一个板,所以请注意你需要根据MACH为machine_restart()中的相关函数提供操作 - (由kernel_restart调用)。如果您只是按原样使用电路板,那么我想用kernel_restart(* cmd)重建内核应该这样做。
答案 2 :(得分:1)
panic()
通常是由内核无法恢复的事件引起的。如果您没有看门狗,则需要查看硬件以查看 GPIO 等是否已连接到 RESET 行。如果是这样,您可以切换此引脚以重新启动CPU。尝试更改panic()
可能会让事情变得更糟,具体取决于您使用的根本原因和功能类型。
您可以使用自定义重启功能挂钩arm_pm_restart
。您可以使用shell命令reboot
(如果存在)对其进行测试。 panic()
应该调用相同的例程。 使用当前的ARM Linux版本
您可能希望在此例程中关闭MMU并阻止中断。从panic()
调用时,它会使其更具弹性。当您要重置时,您可以将例程复制到您喜欢的任何物理地址。
看门狗可能更好;它可能会遇到甚至不能调用panic()
的情况。你可能有一个看门狗而没有意识到这一点。许多Cortex-A CPU都内置了一个。硬件很少没有看门狗。
但是,如果您没有监视程序,则可以使用上面的GPIO机制;硬件应该通常为软件提供重启设备(和外围设备)。 panic()
可能是由于某些行为不当导致内存占用错误,锁定了DRAM / Flash等等。切换 RESET 行可能比看门狗更好案件;如果 RESET 也连接到除CPU之外的其他硬件。
答案 3 :(得分:1)
AFAIK,一种在内核崩溃后重启板的简单方法是传递内核参数(通常来自引导程序)
panic=1
然后,电路板将在恐慌后自动重启'1'秒。
搜索Documentation以获取更多信息。
文档中的一些示例:
...
panic= [KNL] Kernel behaviour on panic: delay <timeout>
timeout > 0: seconds before rebooting
timeout = 0: wait forever
timeout < 0: reboot immediately
Format: <timeout>
...
oops=panic Always panic on oopses. Default is to just kill the
process, but there is a small probability of
deadlocking the machine.
This will also cause panics on machine check exceptions.
Useful together with panic=30 to trigger a reboot.
...
答案 4 :(得分:0)
正如之前的评论所示,看门狗计时器是你的朋友。如果您的硬件包含监视程序计时器,请在内核选项中启用它并进行配置。
其他替代方法是使用Phidget。如果您在远程位置提供USB连接。 Phidget控制器/软件用于使用USB控制您的电路板。检查电路板支持。