linux内核oops错误码说明,Oops 定位错误代码行
這幾天一直在調試atmel at91sam9x25的串口,用著用著總會導致Oops,Oops內容如下:[ 1023.510000] Unable to handle kernel NULL pointer dereference at virtual address 00000000[ 1023.520000] pgd = c0004000[ 1023.520000] [00000000] *pgd=00000000[ 1023.520000] Internal error: Oops: 17 [#1][ 1023.520000] last sysfs file: /sys/devices/virtual/misc/at91flash/dev[ 1023.520000] Modules linked in: at91flash at91gpio at91mc323 ds18b20 at91adc[ 1023.520000] CPU: 0? ? Tainted: G? ?? ???W? ? (2.6.39 #35)[ 1023.520000] PC is at atmel_tasklet_func+0x104/0x690[ 1023.520000] LR is at atmel_tasklet_func+0x10/0x690[ 1023.520000] pc : []? ? lr : []? ? psr: 20000013[ 1023.520000] sp : c7825f58??ip : 60000093??fp : 00000000[ 1023.520000] r10: 00000006??r9 : 00000000??r8 : 0000000a[ 1023.520000] r7 : 00000000??r6 : c7824000??r5 : c78a2484??r4 : c03c0cb8[ 1023.520000] r3 : 0000004c??r2 : 0000004c??r1 : 60000013??r0 : 00000001[ 1023.520000] Flags: nzCv??IRQs on??FIQs on??Mode SVC_32??ISA ARM??Segment kernel[ 1023.520000] Control: 0005317f??Table: 27b40000??DAC: 00000017[ 1023.520000] Process ksoftirqd/0 (pid: 3, stack limit = 0xc7824270)[ 1023.520000] Stack: (0xc7825f58 to 0xc7826000)[ 1023.520000] 5f40:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 00000001 c7824000[ 1023.520000] 5f60: 00000100 0000000a 00000000 00000006 c7825f8c 00000000 00000001 c7824000[ 1023.520000] 5f80: 00000100 0000000a 00000006 c0045cf8 c03b995c c00461d8 c7aa6ae0 00000000[ 1023.520000] 5fa0: 60000093 00000000 c7824000 c0046274 00000013 00000000 00000000 c00462e0[ 1023.520000] 5fc0: 00000000 c7819f70 00000000 c00570e0 00000000 00000000 00000000 00000000[ 1023.520000] 5fe0: c7825fe0 c7825fe0 c7819f70 c0057060 c0030b14 c0030b14 ffffffff ffffffff[ 1023.520000] [] (atmel_tasklet_func+0x104/0x690) from [] (tasklet_action+0x84/0xe
[ 1023.520000] [] (tasklet_action+0x84/0xe
from [] (__do_softirq+0x88/0x124)[ 1023.520000] [] (__do_softirq+0x88/0x124) from [] (run_ksoftirqd+0x6c/0x12
[ 1023.520000] [] (run_ksoftirqd+0x6c/0x12
from [] (kthread+0x80/0x8
[ 1023.520000] [] (kthread+0x80/0x8
from [] (kernel_thread_exit+0x0/0x
[ 1023.520000] Code: 1a000002 e59f057c e59f157c ebfa3d49 (e5973000)[ 1023.710000] ---[ end trace 786b41cd25d3b661 ]---[ 1023.710000] Kernel panic - not syncing: Fatal exception in interrupt[ 1023.720000] [] (unwind_backtrace+0x0/0xe0) from [] (panic+0x50/0x170)[ 1023.720000] [] (panic+0x50/0x170) from [] (die+0x184/0x1c4)[ 1023.730000] [] (die+0x184/0x1c4) from [] (__do_kernel_fault+0x64/0x84)[ 1023.740000] [] (__do_kernel_fault+0x64/0x84) from [] (do_page_fault+0x1b4/0x1c
[ 1023.750000] [] (do_page_fault+0x1b4/0x1c
from [] (do_DataAbort+0x30/0x9
[ 1023.760000] [] (do_DataAbort+0x30/0x98) from [] (__dabt_svc+0x4c/0x60)[ 1023.770000] Exception stack(0xc7825f10 to 0xc7825f58)[ 1023.770000] 5f00:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 00000001 60000013 0000004c 0000004c[ 1023.780000] 5f20: c03c0cb8 c78a2484 c7824000 00000000 0000000a 00000000 00000006 00000000[ 1023.790000] 5f40: 60000093 c7825f58 c01a32b8 c01a33ac 20000013 ffffffff[ 1023.790000] [] (__dabt_svc+0x4c/0x60) from [] (atmel_tasklet_func+0x104/0x690)[ 1023.800000] [] (atmel_tasklet_func+0x104/0x690) from [] (tasklet_action+0x84/0xe8)[ 1023.810000] [] (tasklet_action+0x84/0xe8) from [] (__do_softirq+0x88/0x124)[ 1023.820000] [] (__do_softirq+0x88/0x124) from [] (run_ksoftirqd+0x6c/0x128)[ 1023.830000] [] (run_ksoftirqd+0x6c/0x128) from [] (kthread+0x80/0x88)[ 1023.840000] [] (kthread+0x80/0x88) from [] (kernel_thread_exit+0x0/0x8)注意上述紅色的地方。下面就來顯示如何定位出出錯代碼行:1.首先,編譯時打開complie with debug info選項,步則如下make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig進入 Kernel hacking選擇Compile the kernel with debug info然后,保存,退出。接著make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-編譯, 等編譯完成。2.利用arm-none-linux-gnueabi-gdb 調試,如下:arm-none-linux-gnueabi-gdb vmlinux對應著Oops 消息里面的這一行[ 1023.520000] LR is at atmel_tasklet_func+0x10/0x690在gdb下鍵入命令 :?l *at atmel_tasklet_func+0x10這樣就找到了出錯的代碼行。在這里鄙視一下atmel提供的內核,竟然還有bug,fuck it!從這里可以看出是由于串口的dma導致Oops的,于是我去掉了串口的dma傳輸。方法如下:去掉之后還沒有發現上述的Oops出現。
以上來自:http://bbs.chinaunix.net/thread-3744197-1-1.html
用以上的方法也能解決 Oops,但我發現我的情況是有的串口收發都可以使用 DMA,而有的就不行,于是我一個一個串口的測試,修改源碼,將不能使用DMA的串口的DMA功能關閉掉,而不是將所有串口的?DMA 功能都關閉。
總結
以上是生活随笔為你收集整理的linux内核oops错误码说明,Oops 定位错误代码行的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: linux杀气所以进程,Linux使用k
 - 下一篇: linux内核与设备驱动,第二章 Li