博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
韦东山视频实验之USB鼠标驱动—OOPS错误分析
阅读量:2445 次
发布时间:2019-05-10

本文共 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/

你可能感兴趣的文章
js设置css自定义变量_CSS变量实用指南(自定义属性)
查看>>
http建立个人服务器工具_建立网站和页面的最佳7种工具
查看>>
前端框架浏览器兼容解决方案_前端框架:定制与即用型解决方案
查看>>
php页面不渲染显示源代码_PHP如何执行-从源代码到渲染
查看>>
Sourcehunt 17.1:值得关注的7个有趣PHP软件包
查看>>
使用转发装饰器实现模块化架构
查看>>
旅行者 问题_旅行者-管理员UI可以使Laravel更加平易近人吗?
查看>>
口才配置_快速提示:口才观察者的便捷魔力
查看>>
git 应用程序本身更新_如何使用Git通过SFTP正确部署Web应用程序
查看>>
phpstorm许可证_PhpStorm 8发布-查看新功能并获取免费许可证
查看>>
azure免费一个月_将Windows Azure提升到一个新的水平
查看>>
app engine 入门_Google App Engine和PHP:入门
查看>>
限流 php接口限流 代码_有效地使用PHP流
查看>>
使用Pspell查找和纠正拼写错误的单词
查看>>
PHP依赖注入容器性能基准
查看>>
livereload_LiveReload
查看>>
如何在Windows上安装Ghost
查看>>
phpstorm -xmx_PhpStorm 8-新功能
查看>>
Chrome 27的新功能
查看>>
浏览器趋势(2013年5月):IE8降至10%以下
查看>>