3

我在自定义硬件上使用 Linux 内核 3.0.21。

  • 当我第一次启动硬件时,它成功启动。

  • 如果我正确关闭并再次启动硬件,它会成功启动。

但是一旦系统运行起来,当我输入reboot命令时,内核会重新启动并挂起

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

我不知道为什么每次软重启都会遇到这个问题。为避免这种情况,我需要硬重置(关闭电源并再次打开电源)。

为什么我面临这个问题?内核中是否缺少任何清理功能?如何调试这个问题?

4

3 回答 3

2

是的,听起来平台支持您的硬件的某个地方缺少一些逻辑来应对软重启。

添加清理代码并不能解决问题,因为系统可能会崩溃,然后被软重启。

所以需要编写启动系统的代码来应对系统软重启。

要进行调试,您首先需要找出内核在软重启期间卡住的位置。最简单的方法是使用硬件调试器。

另一种选择是通读启动代码并尝试找出可能依赖冷启动才能工作的任何区域,例如。期望在启动时清除 TLB 或类似的代码。

于 2012-08-30T06:31:28.657 回答
2

听起来像是在重新启动之前无法中和硬件。可能的候选对象是 MMU、TLB、缓存或中断。当这些被重新启用时,崩溃将在内核启动的早期发生(这可能是内核在重新启动之前未能将它们全部禁用,或者引导加载程序依赖于硬重置状态,当然你不会进入软-重启)。

正如其他人所指出的那样,JTAG 硬件调试探针几乎是您无法深入了解这一点的唯一方法。

于 2012-08-30T09:23:49.757 回答
0

要开始调试,我已经启用

CONFIG_DEBUG_LL=y 

在内核构建中。这提供了一些额外的调试启用......在挂断情况和成功启动情况下,我正在比较日志和调试调整 ma 内核卡住的位置......以及为什么

于 2012-08-30T09:53:13.017 回答