Linux内核模块中的内核线程之间的通信

5
我刚开始学习如何在Linux内核2.6上制作内核模块。我的目标是创建三个名为“slaves”的内核线程,它们需要向第四个名为“master”的内核线程发送数据并接收各自的响应。这些线程可以随时请求,因此我需要某种队列结构和一种将响应重定向到正确线程的方法。
起初,我考虑实现自己的队列结构来对入站请求进行排队 - 但是如何向主线程发出信号呢?我不希望主线程一直轮询(例如自旋锁/信号量),我觉得有更好的线程间通信方式。
由于文档缺乏(而且我承认搜索技能较差),我不知道如何实现这一点。你可以给我指个明路吗?
1个回答

4
您面临着两个不同的问题:
  1. 从节点和主节点之间的实际通信。您可以在内核中使用FIFO实现(kernel/kfifo.c)。
  2. 您需要为主节点提供无需繁忙等待/轮询的多路复用。您可以像在用户空间中一样,通过对“事件文件描述符”(eventfd)进行轮询/epoll来完成。请查看include/linux/eventfd.h中的内核级API(实现在fs/eventfd.h中)。

您可能需要为每个从线程使用[kfifo,event file]对。主线程在do_poll()调用中阻塞,并在唤醒时能够根据“信号”的fd使用正确的FIFO。请参考fs/select.c了解如何调用do_poll()

您可能需要使用互斥锁来保护FIFO。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接