1

我尝试在 Linux Kernel 3.3.7 中实现一种新的调度算法并在 BeagleBoard 上启动它。但是,它会引发诸如“内核恐慌 - 不同步:中断中的致命异常”之类的错误。我启用了低级调试功能,调试信息如下:

[    0.000000] ------------[ cut here ]------------
[    0.000000] WARNING: at kernel/lockdep.c:2592 do_vfp+0x8/0x20()
[    0.000000] Modules linked in:
[    0.000000] [<c001c2ec>] (unwind_backtrace+0x0/0x130) from [<c0045afc>] (warn_slow)
[    0.000000] [<c0045afc>] (warn_slowpath_common+0x4c/0x64) from [<c0045b30>] (warn_)
[    0.000000] [<c0045b30>] (warn_slowpath_null+0x1c/0x24) from [<c000f328>] (do_vfp+)
[    0.000000] ---[ end trace 1b75b31a2719ed1c ]---
[    0.000000] Error before arm_notify_die- GDEM-UPM 
[    0.000000] Internal error: Oops - undefined instruction: 0 [#1] SMP
[    0.000000] Modules linked in:
[    0.000000] CPU: 0    Tainted: G        W     (3.3.0-rc7-00008-g8bd3d32-dirty #5)
[    0.000000] PC is at update_curr+0x4/0x5d0
[    0.000000] LR is at task_tick_fair+0x3c/0x154
[    0.000000] pc : [<c0079ac0>]    lr : [<c007a274>]    psr: 800001d3
[    0.000000] sp : c0699e2c  ip : c0698000  fp : c0699ea4
[    0.000000] r10: 00000000  r9 : c0723748  r8 : 00000000
[    0.000000] r7 : 00000000  r6 : c06b4630  r5 : c0e083e8  r4 : c0e08380
[    0.000000] r3 : c007a238  r2 : c06b2108  r1 : c06b4668  r0 : c0e083e8
[    0.000000] Flags: Nzcv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
[    0.000000] Control: 10c5387d  Table: 80004019  DAC: 00000017
[    0.000000] Process swapper/0 (pid: 0, stack limit = 0xc06982f8)
[    0.000000] Stack: (0xc0699e2c to 0xc069a000)
[    0.000000] 9e20:                            c0e08380 c0e083e8 c06b4630 00000000 00
[    0.000000] 9e40: c0723748 00000000 c0699ea4 c007a274 00000002 c06b4630 00000000 00
[    0.000000] 9e60: c0723748 c06b4668 600001d3 c0e08380 00000000 c06b4630 00000000 00
[    0.000000] 9e80: c0723748 00000000 c0699ea4 c00755f0 c0698000 c06b4630 00000000 00
[    0.000000] 9ea0: c072375c c0055288 00000000 00000000 c069a144 00000000 00000000 c0
[    0.000000] 9ec0: c06b7bc0 c069e954 c06b7b40 c002713c 00000000 c008b084 00000000 cc
[    0.000000] 9ee0: 00000000 c06b7bc0 c069e954 0000005f c002713c 00000000 00000000 c0
[    0.000000] 9f00: 00000000 c00a449c 411fc083 00000000 600001d3 c069e900 c069e954 c0
[    0.000000] 9f20: c069e954 c06b7bc0 0000005f 00000000 411fc083 00000000 00000000 c8
[    0.000000] 9f40: c069e900 c069e954 00000001 c00a6b9c c06b2108 c06960e0 c0698000 c0
[    0.000000] 9f60: 000001da c00155f8 fa200000 c0699f90 ffffffff c0699fc4 80004059 cc
[    0.000000] 9f80: c06b4630 c06486d4 20000153 c0483e24 00000000 00000001 01ffffff c4
[    0.000000] 9fa0: 600001d3 c067925c c0e03980 c06b5e14 80004059 411fc083 00000000 00
[    0.000000] 9fc0: 00000001 c0699fd8 00000001 c06486d4 20000153 ffffffff c06481c4 00
[    0.000000] 9fe0: 00000000 c067925c 10c53c7d c06b0cc0 c067922c 80008044 00000000 00
[    0.000000] unwind: Unhandled instruction c9
[    0.000000] Code: c0491260 c0491264 c04911b4 e92d4ff0 (ed2d8b02) 
[    0.000000] ---[ end trace 1b75b31a2719ed1d ]---
[    0.000000] Kernel panic - not syncing: Fatal exception in interrupt`

知道错误在哪里吗?是否有任何调试工具(可能是 KGDB)可用于在内核启动之前对其进行调试?

谢谢!

4

1 回答 1

0

调试启动过程的最好也是唯一的方法是使用beagleboard 上的串行调试端口。这不是很明显,但是您必须将 FTDI 电缆的电线物理连接到 beagleboard 上的接头。本指南的第 17 页表明这是在 beagleboard 的 UART3 上完成的。这也是中断启动过程并进入 Uboot 命令提示符的最简单方法。

我发现使用 minicom 是最好的 linux 程序,可以从终端的串行端口查看串行调试信息。如果您还有问题,请告诉我。

于 2018-07-30T03:30:39.450 回答