关于linux内核wait_event_interruptible和wake_up_interruptible的问题
我有一个内核模块
大致的功能就是完成一个内核态驱动与用户态程序通信的一个框架
当内核驱动函数sm3_update被调用的时候就往用户态发送一串指令,然后阻塞等待回调函数的返回,正常来说当我回调函数收到用户程序返回的指令后判断无误就将sm3flag置为1,然后再调用wake_up_interruptible将阻塞解除,一开始试了几次都是可以的,但是不知道为什么多试几次就会引起系统崩溃,追踪到代码是显示调用wake_up_interruptible的时候报错
[ 44.516147] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 44.527497] pgd = ca490000
[ 44.530189] [00000000] *pgd=8a63f831, *pte=00000000, *ppte=00000000
[ 44.536450] Internal error: Oops: 80000007 [#1] PREEMPT ARM
[ 44.541999] Modules linked in: embms_kernel(O)
[ 44.546427] CPU: 0 PID: 1277 Comm: demol Tainted: G W O 3.18.20 #1
[ 44.553456] task: ca6bb3c0 ti: ca5f8000 task.ti: ca5f8000
有没有大神知道怎么解决啊?
wait_queue_head_t wait_for_netlink_ready; //等待队列头
//回调函数
void ReceiveMsg(struct sk_buff *__skb)
{
。。。
if (!memcmp(dealdata,"Sm3_UpdateOk",12))
{
printk("kernel-receive command = Sm3_UpdateOk\n");
sm3flag = 1;
wake_up_interruptible(&wait_for_netlink_ready);// 唤醒等待队列
}
}
static int sm3_update(struct shash_desc *desc, const u8 *data, unsigned int len)
{
sm3flag = 0;
sendnlmsg("SYSINITSm3_UpdateReqiureHelloWorld/");
pr_info("kernel->sm3_update() start to wait...\n");
if(wait_event_interruptible(wq,sm3flag != 0)) //阻塞模式,是否有数据可读
{
return -ERESTARTSYS;
}
pr_info("kernel->sm3_update() end to wait...\n");
}
static int __init sm3_mod_init(void)
{
。。。
//注册回调函数ReceiveMsg
// 初始化等待队列
init_waitqueue_head(&wait_for_netlink_ready);
。。。
return 0
}