出现kenel BUG信息:
BUG: unable to handle kernel NULL pointer dereference at 00000004
IP: [<c12c2c45>] firmware_loading_store+0x55/0x170
*pdpt = 0000000018ea2001 *pde = 0000000000000000
Oops: 0000 [#1] PREEMPT SMP
last sysfs file: /sys/devices/fw_device/firmware/fw_device/loading
Pid: 3509, comm: osal_fw_hotplug Not tainted 2.6.39 #3
EIP: 0060:[<c12c2c45>] EFLAGS: 00010282 CPU: 0
EIP is at firmware_loading_store+0x55/0x170
EAX: 00000000 EBX: d8968c00 ECX: 00000000 EDX: 1c0c6000
ESI: d8968c40 EDI: d93d0960 EBP: ffffffed ESP: d8c4bf20
DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
Process osal_fw_hotplug (pid: 3509, ti=d8c4a000 task=d9c86130 task.ti=d8c4a000)
Stack:
00000161 80000000 000000d0 d89a0b00 c12c2bf0 00000002 d8ed3c30 c12b7765
00000002 c15a4e0c 00000002 c1101826 00000002 08063188 d9736b14 c15a4e0c
d8968c48 d9296d00 00000002 08063188 c1101780 c10b4d40 d8c4bf9c d89a0b00
Call Trace:
[<c12c2bf0>] ? firmware_class_timeout+0x10/0x10
[<c12b7765>] ? dev_attr_store+0x25/0x40
[<c1101826>] ? sysfs_write_file+0xa6/0x100
[<c1101780>] ? sysfs_poll+0x80/0x80
[<c10b4d40>] ? vfs_write+0xa0/0x140
[<c10b4fe1>] ? sys_write+0x41/0x80
[<c154e9d1>] ? syscall_call+0x7/0xb
Code: 04 e8 80 08 de ff 8b 53 1c 31 c9 8b 43 18 8b 7b 10 c7 04 24 61 01 00 00 c7 44 24 04 00 00 00 80 e8 81 08 de ff 89 47 04 8b 43 10 <8b> 50 04 85 d2 0f 84 ec 00 00 00 8b 53 18 89 50 08 89 d8 c7 43
EIP: [<c12c2c45>] firmware_loading_store+0x55/0x170 SS:ESP 0068:d8c4bf20
CR2: 0000000000000004
如何调试?
这种情况下,应该是出现了kernel NULL指针,出现空指针有可能导致内核出现上述的错误信息,或者更严重的会出现Ooops,kernel panic.只关上讲,从上面的出错信息中可以了解到,出错函数位于:IP: [<c12c2c45>] firmware_loading_store+0x55/0x170,函数体大小大约为0x170,大约位于0x55的offset.
在kernel底下找到此函数,位于driver/base/firmware_class.c,这个是用于sysfs,用来进行fimrware 读写的接口。
这里涉及到注册到sysfs的接口:
static DEVICE_ATTR(loading, 0644, firmwa