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

Ram*_*Ram 5 multithreading ipc kernel-module linux-kernel

我刚刚开始学习在 linux 内核 2.6 上制作内核模块的技巧。我想要做的是有 3 个内核线程,称为从线程,需要将数据发送到第 4 个内核线程,称为主线程,并接收它们各自的响应。slaves 可以随时请求,这意味着我需要某种队列结构和一种将响应重定向到正确线程的方法。

首先,我着眼于实现我自己的队列结构来对传入的请求进行排队 - 但我如何向主人发出信号?我不希望主人继续轮询(如自旋锁/信号量的情况)。我有一种感觉,在线程之间有更好的通信方式。

由于缺乏文档(以及公认的较差的搜索技能),我对如何实现这一点感到茫然。你能为我指出正确的方向吗?

Mir*_*cea 4

您面临两个不同的问题:

  1. 从机和主机之间的实际通信。您可以使用内核中的 FIFO 实现 ( kernel/kfifo.c)。
  2. 您需要在不忙等待/轮询的情况下对主设备进行解复用。您可以像在用户空间中一样,通过“事件文件描述符”(eventfd)上的 poll/epoll 来完成此操作。看一下内核级 API include/linux/eventfd.h(实现在fs/eventfd.h)。

您可能应该为每个从属线程使用 [kfifo,事件文件] 对。主线程阻塞在do_poll()调用中,并且在被唤醒时能够根据“发出信号”的 fd 使用正确的 FIFO。请查看fs/select.c以了解应该如何调用do_poll()

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