Oops: o acesso do kernel da área ruim, sig: 11 - 'swapper' - matando manipulador de interrupção

StackOverflow https://stackoverflow.com/questions/919575

Pergunta

Em um ambiente Linux embarcado (personalizado 2.4.25 em PowerPC) recebo a seguinte kernel panic depois de algumas horas:

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 / módulos:

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]
...

Eu pesquisei para ajudar, mas eu não poderia encontrar algo útil. A também queria 'decodificar' o registo de chamadas, mas eu não entendo como .... os endereços não correspondem aos endereços em System.map. Alguém pode me explicar como descobrir o erro?

Obrigado, chris

Foi útil?

Solução

NIP é a próxima instrução Pointer ou mais genericamente o contador de programa (a.k.a PC ) e indica onde o oops'd kernel. De acordo com a saída do ksyms, o conteúdo de NIP (0xC9471C7C) parece estar em functionA. Você deve ser capaz de usar objdump -S no módulo functionA e descobrir o que a instrução está em functionA+0x108.

A ligação Register ( LR ) contém o endereço de retorno da função atual e indica o chamador de functionA. Você pode olhar no arquivo System.map para encontrar a função que contém este endereço ou usar o GNU binutils addr2line programa em sua imagem vmlinux para obter a mesma informação. De lá, você deve ser capaz de ter uma melhor idéia do que causou o oops.

aqui e aqui para obter mais informações sobre os registros de PPC e montagem.

Outras dicas

É as opções de configuração CONFIG_KALLSYMS disponível neste kernel? Se ele é e você pode recompilar o kernel, você deve obter um oops whith informação simbólica.

Como apontado pelo comentário, Linux 2.4 não tem kallsyms, então você deve habilitar frame_pointer e CONFIG_DEBUG. O registo de chamadas e system.map deve são o endereço virtual, e jogo. Eles podem não corresponder exatamente, mas você pode encontrar que símbolo é o mais próximo.

Por exemplo, na outptut backtrace: C0018C74 and C0018A1C olhar como endereço de código do kernel, mas gama C9xxxxxx não se parece com endereço kernel para mim. É onde os módulos do kernel poderia estar ligado?

Por favor, postar algumas linhas no final do system.map

Edit: Desde sua saída ksyms, parece que a falha ocorre em functiona do seu módulo personalizado, porque NIP C9471C7C é logo após c9471b74 e:

  • NIP significa Pointer próxima instrução
  • c9471b74 é o endereço de início de functiona de acordo com a sua saída ksyms.

LR é o link de registro, isto é, normalmente, o registo em que o endereço de retorno é armazenado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top