Debugging 理解内核oops错误代码

Debugging 理解内核oops错误代码,debugging,linux-kernel,kernel,panic,Debugging,Linux Kernel,Kernel,Panic,在ARM的内核OOP中,以下日志打印在内核日志中- <1>[ 4205.112835] I[0:swapper/0:0] [c0] Unable to handle kernel paging request at virtual address ff898580 <1>[ 4205.112874] I[0:swapper/0:0] [c0] pgd = ec3c4000 <1>[ 4205.112901] I[0:swapper/0:0] [c0] [f

在ARM的内核OOP中,以下日志打印在内核日志中-

<1>[ 4205.112835] I[0:swapper/0:0] [c0] Unable to handle kernel paging request at virtual address ff898580 
<1>[ 4205.112874] I[0:swapper/0:0] [c0] pgd = ec3c4000 
<1>[ 4205.112901] I[0:swapper/0:0] [c0] [ff898580] *pgd=00000000 
<0>[ 4205.112939] I[0:swapper/0:0] [c0] Internal error: Oops: 80000005 #1] PREEMPT SMP ARM
在大多数日志中,它是-

Internal error: Oops: 5 [#1] PREEMPT SMP ARM

有人能解释一下这段代码的目的和意义吗?

您提供的信息很少

你会发现

printk(KERN_EMERG "Internal error: %s: %x [#%d]" S_PREEMPT S_SMP S_ISA "\n", str, err, ++die_counter);
实际上,整个堆栈跟踪将更有帮助,您将找到bug的位置,并通过反汇编找到代码中的真实位置


猜测一下,你碰到了一个空指针==

你能提供整个堆栈跟踪吗<代码>未定义指令非常奇怪。这意味着编译器将代码转换为硬件不支持的指令。不过,这可能是一些简单的操作,比如禁用浮点操作。看见
printk(KERN_EMERG "Internal error: %s: %x [#%d]" S_PREEMPT S_SMP S_ISA "\n", str, err, ++die_counter);