糟糕:内核访问不良区域,sig:11 – “swapper” – 查杀中断处理程序

在一个embedded式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] ... 

我googlesearch帮助,但我找不到有用的东西。 也想'解码'回溯,但我不明白如何….地址不对应于System.map中的地址。 任何人都可以解释我如何找出错误?

谢谢,克里斯

NIP是下一个指令指针或更一般的程序计数器(又名PC ),并指出内核哎呀。 根据ksyms的输出, NIP0xC9471C7C )的内容看起来在functionA 。 您应该能够在functionA模块上使用objdump -S并找出functionA+0x108指令。

链接寄存器( LR )保存当前函数的返回地址,并指示函数A的调用者。 您可以查看System.map文件以查找包含此地址的函数,也可以使用vmlinux映像上的GNU binutils程序addr2line来获取相同的信息。 从那里,你应该能够更好地了解是什么造成了哎呀。

在这里和这里看到关于PPC寄存器和汇编的更多信息。

这个内核上配置选项CONFIG_KALLSYMS是否可用? 如果是,你可以重新编译你的内核,你应该得到一个象征性的信息。

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

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

请在system.map的末尾张贴一些行

编辑:从您的ksyms输出,似乎故障发生在您的自定义模块的FunctionA,因为NIP C9471C7C是正确的后c9471b74和:

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

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