关于linux内核wait_event_interruptible和wake_up_interruptible的问题

钟剑锋-JeffChong 2020-04-20 04:09:58
我有一个内核模块
大致的功能就是完成一个内核态驱动与用户态程序通信的一个框架
当内核驱动函数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
}
...全文
944 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2020-06-04
  • 打赏
  • 举报
回复
指针被复位了,指针为0
moquan1100 2020-06-01
  • 打赏
  • 举报
回复
把wake_up_interruptible换掉
recklesshao 2020-05-31
  • 打赏
  • 举报
回复
有没有可能重新编译一下你的kernel。CONFIG_CRASH_DUMP=y,CONFIG_DEBUG_INFO=y这两个选项开没开。看看能用新的kernel拿到更多的信息。你这个dump信息太少了。
scutth 2020-05-29
  • 打赏
  • 举报
回复
引用 5 楼 Mr_Jaychong 的回复:
上面就是kernel的打印信息,我摘取了关键的部分出来
这部分不是关键,关键信息是函数调用的stack,你贴的只是挂的时候这一丢丢信息,几乎没有用。
  • 打赏
  • 举报
回复
上面就是kernel的打印信息,我摘取了关键的部分出来
scutth 2020-05-17
  • 打赏
  • 举报
回复
引用 3 楼 Mr_Jaychong 的回复:
你是指回调函数的注册代码吗?
不是,是kernel挂的时候打印出来的信息,调用堆栈信息。
  • 打赏
  • 举报
回复
你是指回调函数的注册代码吗?
scutth 2020-05-01
  • 打赏
  • 举报
回复
wait和wake up流程看起来没问题。 从你发的call stack看,是空指针的访问,但是你发的code上看不出来。有完整的call stack吗?

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧