本文共 6097 字,大约阅读时间需要 20 分钟。
先将上节的代码
#if 1 usb_buffer_alloc(usbdev, len, GFP_ATOMIC, &usb_dma_buff_phys_addr); //初开始没有给bus_buff赋值,导致内核引用出现错误 #else usb_buff = usb_buffer_alloc(usbdev, len, GFP_ATOMIC, &usb_dma_buff_phys_addr); //分配缓冲空间,用来返回缓冲地址 #endif
改为1这样就能弹出oops错误,但是还需要汇编代码,要不然弹出的oops错误不知从何处找到错误
现在来先修改一下Makefile,加入下面一句
arm-linux-objdump -D -m arm -S usbmouse_as_key.ko>usbmouse.dis
下面这个模块加载之后,移动鼠标就会弹出以下oops错误,
Unable to handle kernel NULL pointer dereference at virtual address 00000000pgd = c0004000[00000000] *pgd=00000000Internal error: Oops: 17 [#1]Modules linked in: usbmouse_as_keyCPU: 0 Not tainted (2.6.29.4-FriendlyARM #14)PC is at usbmouse_callback+0x1c/0xac [usbmouse_as_key]LR is at usb_hcd_giveback_urb+0x6c/0x108pc : [] lr : [ ] psr: 60000093sp : c035de18 ip : c035de48 fp : c035de44r10: 00000000 r9 : bf0003a0 r8 : 00000000r7 : c38984c0 r6 : bf000c5c r5 : c3898400 r4 : 00000000r3 : 00000000 r2 : 00000003 r1 : 00000204 r0 : c38fdb80Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernelControl: c000717f Table: 33954000 DAC: 00000017Process swapper (pid: 0, stack limit = 0xc035c268)Stack: (0xc035de18 to 0xc035e000)de00: 00000000 c38fdb80 de20: c3898400 00000000 c38984c0 00000004 c38984c0 00000000 c035de64 c035de48 de40: c01a2754 bf0002a4 c3898400 c38fdb80 00000000 c38984c0 c035de84 c035de68 de60: c01b1634 c01a26f8 c38d2a60 ffc42040 c38fdb80 00000000 c035dec4 c035de88 de80: c01b2f50 c01b15e4 c0042af0 c3898400 00000002 c4e00000 c03a07c8 c3898400 dea0: 00000093 00000000 0000002a 3001b2e4 41129200 3001b2b0 c035dedc c035dec8 dec0: c01a2448 c01b2be0 c38d2180 00000000 c035defc c035dee0 c005dca8 c01a2414 dee0: c036580c c38d2180 0000002a c03a20d0 c035df1c c035df00 c005efc0 c005dc74 df00: 0000002a c03a4674 00000000 c037e484 c035df3c c035df20 c0026044 c005ef2c df20: ffffffff f4000000 04000000 c037e484 c035df94 c035df40 c0026a44 c0026010 df40: f4100000 00000032 f4100000 60000013 c0027edc c035c000 c0027edc c037e484 df60: 3001b2e4 41129200 3001b2b0 c035df94 c035df98 c035df88 c00284f8 c0027f3c df80: 60000013 ffffffff c035dfb4 c035df98 c00284f8 c0027eec c03a2464 c037e440 dfa0: c001c000 c0360440 c035dfc4 c035dfb8 c02899b4 c00284bc c035dff4 c035dfc8 dfc0: c0008930 c0289968 c0008470 00000000 00000000 c001cd38 00000000 c0007175 dfe0: c037e55c c001cd34 00000000 c035dff8 30008034 c0008740 00000000 00000000 Backtrace: [ ] (usbmouse_callback+0x0/0xac [usbmouse_as_key]) from [ ] (usb_hcd_giveback_urb+0x6c/0x108)[ ] (usb_hcd_giveback_urb+0x0/0x108) from [ ] (finish_urb+0x60/0xa8) r7:c38984c0 r6:00000000 r5:c38fdb80 r4:c3898400[ ] (finish_urb+0x0/0xa8) from [ ] (ohci_irq+0x380/0x44c) r7:00000000 r6:c38fdb80 r5:ffc42040 r4:c38d2a60[ ] (ohci_irq+0x0/0x44c) from [ ] (usb_hcd_irq+0x44/0xac)[ ] (usb_hcd_irq+0x0/0xac) from [ ] (handle_IRQ_event+0x44/0x80) r5:00000000 r4:c38d2180[ ] (handle_IRQ_event+0x0/0x80) from [ ] (handle_edge_irq+0xa4/0x160) r7:c03a20d0 r6:0000002a r5:c38d2180 r4:c036580c[ ] (handle_edge_irq+0x0/0x160) from [ ] (__exception_text_start+0x44/0x70) r7:c037e484 r6:00000000 r5:c03a4674 r4:0000002a[ ] (__exception_text_start+0x0/0x70) from [ ] (__irq_svc+0x24/0xa0)Exception stack(0xc035df40 to 0xc035df88)df40: f4100000 00000032 f4100000 60000013 c0027edc c035c000 c0027edc c037e484 df60: 3001b2e4 41129200 3001b2b0 c035df94 c035df98 c035df88 c00284f8 c0027f3c df80: 60000013 ffffffff r7:c037e484 r6:04000000 r5:f4000000 r4:ffffffff[ ] (default_idle+0x0/0xac) from [ ] (cpu_idle+0x4c/0x68)[ ] (cpu_idle+0x0/0x68) from [ ] (rest_init+0x5c/0x70) r7:c0360440 r6:c001c000 r5:c037e440 r4:c03a2464[ ] (rest_init+0x0/0x70) from [ ] (start_kernel+0x200/0x268)[ ] (start_kernel+0x0/0x268) from [<30008034>] (0x30008034) r6:c001cd34 r5:c037e55c r4:c0007175Code: e59f608c e59f908c e5968008 e3a04000 (e5d8c000) Kernel panic - not syncing: Fatal exception in interrupt
Unable to handle kernel NULL pointer dereference at virtual address 00000000
从这里面我们知道是一个空指针,但是我们并不知道具体在哪里呀,所以我们看下面
PC is at usbmouse_callback+0x1c/0xac [usbmouse_as_key] LR is at usb_hcd_giveback_urb+0x6c/0x108
这里给我了出错的为位置和返回的位置,但这个位置还是比较空泛,根本不知道在哪呀!
再看下trace,从中我们可以理解调用关系,以下是被调用(请参看上面的代码)
usbmouse_callback <- usb_hcd_giveback_urb <- finish_urb <- ohci_irq <- usb_hcd_irq <- handle_IRQ_event <- handle_edge_irq <- __exception_text_start <- __irq_svc
下面我就来看具体的位置
将刚才我们make产生的汇编代码带上来,看看到底是哪里出错了?
由于汇编产生的代码过于庞大,现在只摘取usbmous_callback处的代码
00000294: 294: e1a0c00d mov ip, sp 298: e92ddff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc} 29c: e24cb004 sub fp, ip, #4 ; 0x4 2a0: e59f608c ldr r6, [pc, #140] ; 334 2a4: e59f908c ldr r9, [pc, #140] ; 338 2a8: e5968008 ldr r8, [r6, #8] 2ac: e3a04000 mov r4, #0 ; 0x0 2b0: e5d8c000 ldrb ip, [r8] 2b4: e3a07001 mov r7, #1 ; 0x1 2b8: e1a0a006 mov sl, r6 2bc: e1a03417 lsl r3, r7, r4 2c0: e5d62014 ldrb r2, [r6, #20] 2c4: e003500c and r5, r3, ip 2c8: e0033002 and r3, r3, r2 2cc: e1530005 cmp r3, r5 2d0: 1a000007 bne 2f4 2d4: e2844001 add r4, r4, #1 ; 0x1 2d8: e3540003 cmp r4, #3 ; 0x3 2dc: 1afffff6 bne 2bc 2e0: e5960000 ldr r0, [r6] 2e4: e3a010d0 mov r1, #208 ; 0xd0 2e8: e5c6c014 strb ip, [r6, #20] 2ec: ebfffffe bl 0 2f0: e89daff8 ldm sp, {r3, r4, r5, r6, r7, r8, r9, sl, fp, sp, pc} 2f4: e1a01004 mov r1, r4 2f8: e59f003c ldr r0, [pc, #60] ; 33c 2fc: ebfffffe bl 0 300: e2553000 subs r3, r5, #0 ; 0x0 304: 13a03001 movne r3, #1 ; 0x1 308: e7992104 ldr r2, [r9, r4, lsl #2] 30c: e59a0010 ldr r0, [sl, #16] 310: e3a01001 mov r1, #1 ; 0x1 314: ebfffffe bl 0 318: e3a01000 mov r1, #0 ; 0x0 31c: e59a0010 ldr r0, [sl, #16] 320: e1a02001 mov r2, r1 324: e1a03001 mov r3, r1 328: ebfffffe bl 0 32c: e5d8c000 ldrb ip, [r8] 330: eaffffe7 b 2d4 ... 33c: 00000098 .word 0x00000098
出错位置为0x294+0x1c=0x2b0,下面这句
2b0: e5d8c000 ldrb ip, [r8] 这里r8我们并不知道,看到上面需要知道r6
而r6需要 2a0: e59f608c ldr r6, [pc, #140] ; 334 <usbmouse_callback+0xa0>
这里看出 r6 = [0x2a0+8+140] =0x334, 而这时发现0x334并没有内容,遇到点问题,回头再看看为什么!!
转载地址:http://lbtqb.baihongyu.com/