我测试驱动中异步信号通知机制的时候出现如下问题,请问大家有谁知道是什么原因吗?
[root@EmbedSky /]# ./globalvar_fasync_test
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c3b04000
[00000000] *pgd=33b02031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#2]
Modules linked in: globalvar_fasync ov9650 zd1211rw rt73usb rt2x00usb rt2x00lib mac80211 input_polldev
CPU: 0 Tainted: G D (2.6.30.4-EmbedSky #1)
PC is at fasync_helper+0x30/0x130
LR is at fasync_helper+0x118/0x130
pc : [<c00b1350>] lr : [<c00b1438>] psr: a0000093
sp : c3afbf38 ip : c3aea020 fp : c3afbf54
r10: 00000000 r9 : c3afa000 r8 : c0045008
r7 : 00000003 r6 : 00000000 r5 : 00000001 r4 : c3abed80
r3 : a0000093 r2 : c3aea030 r1 : 000000d0 r0 : c3aea020
Flags: NzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user
Control: c000717f Table: 33b04000 DAC: 00000015
Process globalvar_fasyn (pid: 641, stack limit = 0xc3afa268)
Stack: (0xc3afbf38 to 0xc3afc000)
bf20: 00000004 00002002
bf40: c3abed80 00000003 c3afbf64 c3afbf58 bf064014 c00b1330 c3afbf84 c3afbf68
bf60: c00b1b24 bf064010 00000004 00002002 c3abed80 00000003 c3afbfa4 c3afbf88
bf80: c00b1c3c c00b1888 00000003 00000004 00002002 000000dd 00000000 c3afbfa8
bfa0: c0044e60 c00b1c04 00000003 00000004 00000003 00000004 00002002 be86ab2c
bfc0: 00000003 00000004 00002002 000000dd 00000000 00000000 40025000 be86ab44
bfe0: 000108b4 be86ab00 00008604 400f0a0c 60000010 00000003 5fff7fdf de7bfe5e
Backtrace:
[<c00b1320>] (fasync_helper+0x0/0x130) from [<bf064014>] (globalvar_test_fasync+0x14/0x18 [globalvar_fasync])
r7:00000003 r6:c3abed80 r5:00002002 r4:00000004
[<bf064000>] (globalvar_test_fasync+0x0/0x18 [globalvar_fasync]) from [<c00b1b24>] (do_fcntl+0x2ac/0x37c)
[<c00b1878>] (do_fcntl+0x0/0x37c) from [<c00b1c3c>] (sys_fcntl64+0x48/0x90)
r7:00000003 r6:c3abed80 r5:00002002 r4:00000004
[<c00b1bf4>] (sys_fcntl64+0x0/0x90) from [<c0044e60>] (ret_fast_syscall+0x0/0x2c)
r7:000000dd r6:00002002 r5:00000004 r4:00000003
Code: 1a000038 e10f3000 e3833080 e121f003 (e5961000)
---[ end trace b173c69ea79ea5c9 ]---
Segmentation fault
测试程序为
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<fcntl.h>
#include<signal.h>
#include<unistd.h>
void input_handler(int signum)
{
printf("receive a signal from globalmem,signalnum:%d\n",signum);
}
int main()
{
int fd,oflags;
fd = open("/dev/globalvar",O_RDWR,S_IRUSR|S_IWUSR);
if(fd != -1){
signal(SIGIO,input_handler);
fcntl(fd,F_SETOWN,getpid());
oflags = fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC);
while(1){
sleep(100);
}
}else{
printf("device open failure\n");
}
} |