【问题标题】:Oops: kernel access of bad area, sig: 11 - 'swapper' - killing interrupt handler糟糕:坏区域的内核访问,sig:11 - 'swapper' - 终止中断处理程序
【发布时间】:2009-05-28 07:18:48
【问题描述】:

在嵌入式 linux 环境中(在 PowerPC 上定制 2.4.25)我在几个小时后得到以下内核崩溃:

Oops: kernel access of bad area, sig: 11
NIP: C9471C7C XER: 20000000 LR: C0018C74 SP: C0198E20 REGS: c0198d70 TRAP: 0800    Not tainted
MSR: 00009030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
DEAR: C9876FFF, ESR: 00000000
TASK = c0197020[0] 'swapper' Last syscall: 120
last math 00000000 last altivec 00000000
PLB0: bear= 0x48041040 acr=   0x00000000 besr=  0x00000000
PLB0 to OPB: bear= 0x00cc1000 besr0= 0x00000000 besr1= 0x00000000

GPR00: 00000000 C0198E20 C0197020 00000000 C016E494 000000C2 C01D0000 00000000
GPR08: C98701F0 C9876FFF 00008000 C768AE0F 24004022 1001B120 07FC9500 00000000
GPR16: 00000001 00000001 FFFFFFFF 007FFE00 00001032 00198EE0 00000000 C0004780
GPR24: C01D2F68 C01E0000 C0170000 C0170000 C01B0000 C9473870 00000000 C9473864
Call backtrace:
00000001 C0018C74 C0018A1C C0005E14 C0004780 C0022724 C0005D4C
C0005D60 C0002430 C01AE5BC C0002328
Kernel panic: Aiee, killing interrupt handler!
In interrupt handler - not syncing
 <0>Rebooting in 1 seconds...

cat /proc/modules:

CustomModule1          10556   4
CustomModule2           5488   0
CustomModule3          10240   1
fuse                   35576   4
usb-storage            28468   0 (unused)
keybdev                 3076   0 (unused)
mousedev                6116   0 (unused)
hid                    17968   0 (unused)
input                   6192   0 [keybdev mouse

ksyms -m:

Address   Symbol                 Defined by
c9471000  (11k)                  [CustomModule1]
c9471b74  functionA              [CustomModule1]
c947358c  functionB              [CustomModule1]
c9473580  functionC              [CustomModule1]
...

我搜索了帮助,但找不到有用的东西。 A 还想“解码”回溯,但我不明白如何......地址与 System.map 中的地址不对应。谁能解释一下如何找出错误?

谢谢, 克里斯

【问题讨论】:

  • @shodanex 评论是很好的第一步,但同时获得 'cat /proc/modules' 的输出也很有用
  • 我附加了输出,但我认为这不会有很大帮助......
  • 您的系统是否有支持 -m 选项的 ksyms 版本?如果是这样,它将列出每个可加载模块的起始地址(相同的信息显示在 Linux 2.6.x 下的 /proc/modules 中)。我们的想法是查看相关地址是否可能对应于可加载模块之一。
  • @ctuffli:我发布了 ksyms -m 输出的开头。 NIP 的值似乎介于函数 A 和函数 B 之间。这是否意味着functionA有问题?无论如何,NIP、LR、CP 等是什么意思?当谷歌搜索“oops nip”时,我刚刚找到了 celeb nip slips 的结果:-D

标签: linux linux-kernel kernel powerpc


【解决方案1】:

NIP 是下一条指令指针或更一般的程序计数器(又名 PC),它指示内核在哪里发生错误。根据 ksyms 的输出,NIP (0xC9471C7C) 的内容看起来在functionA 中。您应该能够在 functionA 模块上使用 objdump -S 并找出 functionA+0x108 的指令。

链接寄存器(LR)保存当前函数的返回地址,并指示functionA的调用者。您可以在 System.map 文件中查找包含此地址的函数,也可以在 vmlinux 映像上使用 GNU binutils 程序 addr2line 来获取相同的信息。从那里,您应该能够更好地了解导致 oops 的原因。

有关 PPC 寄存器和程序集的更多信息,请参阅 herehere

【讨论】:

  • 感谢您提供这个有用的答案。暂时,这是我想知道的,因此我会将这个答案标记为已接受。
【解决方案2】:

配置选项 CONFIG_KALLSYMS 在这个内核上可用吗?如果是,并且您可以重新编译内核,您应该会得到一个带有符号信息的 oops。

正如评论所指出的,linux 2.4 没有 kallsyms,因此您应该启用 frame_pointer 和 CONFIG_DEBUG。 backtrace 和 system.map 应该是虚拟地址,并且匹配。它们可能不完全匹配,但您可以找到最接近的符号。

例如,在回溯输出中: C0018C74 and C0018A1C 看起来像内核代码地址,但 C9xxxxxx 范围对我来说不像内核地址。是可以链接内核模块的地方吗?

请在system.map的末尾张贴几行

编辑: 从您的 ksyms 输出来看,您的自定义模块的 FunctionA 似乎出现了故障,因为NIP C9471C7C 就在c9471b74 之后并且:

  • NIP 代表下一条指令指针
  • c9471b74 是 FunctionA 根据您的 ksyms 输出的起始地址。

LR为链接寄存器,即通常存放返回地址的寄存器。

【讨论】:

  • 我猜它不可用。运行make config 时不会出现。我也在配置文件中手动输入了它,但这并没有改变行为,糟糕的消息看起来还是一样的......
  • Linux 2.4.x 没有 KALLSYMS。检查您的 .config 文件是否包含 CONFIG_DEBUG_KERNEL=y 和 CONFIG_FRAME_POINTER=y。如果没有,请在 menuconfig 的“Kernel hacking”部分启用这些
  • @stsquad:怎么样?地址不对应...如何找出偏移量?
  • @ctuffli:CONFIG_DEBUG_KERNEL 可用但未启用,另一个不存在。启用此功能后会有什么不同?
  • CONFIG_FRAME_POINTER 在我认为的 powerp pc 上没用
猜你喜欢
  • 2020-04-28
  • 2012-02-03
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 2015-03-09
  • 2018-02-25
  • 2015-05-09
相关资源
最近更新 更多