今天编写一个key.ko驱动模块文件,使用insmod命令报错出一下的代码,头痛了一天,找了一天的错误终于发现是指针的问题。
[ 74.970000] Unable to handle kernel NULL pointer dereference at virtual address 0000000c
[ 74.980000] pgd = ee2e4000
[ 74.980000] [0000000c] *pgd=6e06c831, *pte=00000000, *ppte=00000000
[ 74.985000] Internal error: Oops: 17 [#1] PREEMPT SMP ARM
[ 74.985000] Modules linked in: mykey(O+)
[ 74.985000] CPU: 2 PID: 1388 Comm: insmod Tainted: G O 3.14.0 #30
[ 74.985000] task: ee1d4780 ti: ee262000 task.ti: ee262000
[ 74.985000] PC is at of_get_named_gpiod_flags+0xa4/0xcc
[ 74.985000] LR is at _raw_spin_unlock_irqrestore+0x18/0x44
[ 74.985000] pc : [<c01f8398>] lr : [<c052da54>] psr: a0000053
[ 74.985000] sp : ee263dd0 ip : ee263ddc fp : c007278c
[ 74.985000] r10: 00000001 r9 : ee0ca840 r8 : bf002000
[ 74.985000] r7 : bf00050c r6 : fffffffe r5 : 00000000 r4 : 00000000
[ 74.985000] r3 : 00000000 r2 : 00000000 r1 : c0562b38 r0 : c0772618
[ 74.985000] Flags: NzCv IRQs on FIQs off Mode SVC_32 ISA ARM Segment user
[ 74.985000] Control: 10c5387d Table: 6e2e404a DAC: 00000015
[ 74.985000] Process insmod (pid: 1388, stack limit = 0xee262240)
[ 74.985000] Stack: (0xee263dd0 to 0xee264000)
[ 74.985000] 3dc0: ee263ddc c087bc24 00000000 00000000
[ 74.985000] 3de0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 74.985000] 3e00: 00000000 fffffdfb ee922e80 bf00061c bf0004d0 bf00206c eefc9d90 c00ae620
[ 74.985000] 3e20: 00030003 10000000 ee262000 00000000 bf0004d0 c00087b4 eea52000 00000000
[ 74.985000] 3e40: c076f2f8 c0884630 ee922e80 ef1e9620 ee0caa00 00000000 eefc9d30 c00ae620
[ 74.985000] 3e60: ef1e9620 0000c662 00000000 0000001c eefc9d20 c00ae620 00000001 0000909a
[ 74.985000] 3e80: ee0ca840 ee263f58 ee263f58 bf0004c4 bf0004d0 bf00050c 00000001 00000001
[ 74.985000] 3ea0: c007278c c0074f9c bf0004d0 00007fff c007301c 0000065f c00727e4 ee262000
[ 74.985000] 3ec0: bf0004c4 bf00060c f00a8638 00000000 00000000 bf0004d0 6e72656b 00006c65
[ 74.985000] 3ee0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 74.985000] 3f00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 74.985000] 3f20: 00000000 00000000 00000000 c00a4260 000000d2 0001b1b7 001e0058 001cefc2
[ 74.985000] 3f40: 00000080 c000e5a4 ee262000 00000000 00000000 c00755a4 f0094000 0001b1b7
[ 74.985000] 3f60: f00a7fa8 f00a7ded f00aeeb8 00000624 000007f4 00000000 00000000 00000000
[ 74.985000] 3f80: 0000002a 0000002b 00000014 00000000 00000010 00000000 00000000 bef49e64
[ 74.985000] 3fa0: 00000069 c000e420 00000000 bef49e64 001e0058 0001b1b7 001cefc2 00000000
[ 74.985000] 3fc0: 00000000 bef49e64 00000069 00000080 bef49e68 001cefc2 bef49e68 00000000
[ 74.985000] 3fe0: 00000000 bef49ae8 000387e8 0000bc70 60000050 001e0058 e1a04000 ba00001a
[ 74.985000] [<c01f8398>] (of_get_named_gpiod_flags) from [<bf00206c>] (init_module+0x6c/0x1f0 [mykey])
[ 74.985000] [<bf00206c>] (init_module [mykey]) from [<c00087b4>] (do_one_initcall+0x30/0x144)
[ 74.985000] [<c00087b4>] (do_one_initcall) from [<c0074f9c>] (load_module+0x173c/0x1c68)
[ 74.985000] [<c0074f9c>] (load_module) from [<c00755a4>] (SyS_init_module+0xdc/0xe0)
[ 74.985000] [<c00755a4>] (SyS_init_module) from [<c000e420>] (ret_fast_syscall+0x0/0x30)
[ 74.985000] Code: e28dd038 e8bd8070 e59f0024 e59f101c (e595200c)
[ 75.265000] ---[ end trace 9d4778776cea6297 ]---
Segmentation fault
出错原因
我的if(pmykey = NULL)少写了一个=号,导致pmykey在赋值的时候直接变成空指针,在下面的程序每当要用到这个指针时就会出错