【问题标题】:Communication between kernel threads in a linux kernel modulelinux内核模块中内核线程之间的通信
【发布时间】:2011-11-24 17:28:29
【问题描述】:
我刚刚开始学习在 linux 内核 2.6 上制作内核模块的技巧。我想做的是有 3 个内核线程,称为从属,需要将数据发送到第四个内核线程,称为主线程,并接收它们各自的响应。从站可以随时请求,这意味着我需要某种队列结构和一种将响应重定向到正确线程的方法。
首先我着眼于实现我自己的队列结构来对传入请求进行排队 - 但我如何向主人发出信号呢?我不希望主人继续轮询(如自旋锁/信号量的情况)。我有一种感觉有更好的方式在线程之间进行通信。
由于缺乏文档(当然搜索技能较差),我不知道如何实现这一点。你能指出我正确的方向吗?
【问题讨论】:
标签:
multithreading
linux-kernel
ipc
kernel-module
【解决方案1】:
您面临两个明显的问题:
- 从站和主站之间的实际通信。您可以在内核中使用 FIFO 实现 (
kernel/kfifo.c)。
- 您需要在没有忙等待/轮询的情况下为主设备解复用。您可以像在用户空间中一样通过“事件文件描述符”(eventfd)上的 poll/epoll 来执行此操作。看看
include/linux/eventfd.h 中的内核级API(实现在fs/eventfd.h 中)。
您可能应该为每个从属线程使用 [kfifo, event file] 对。主线程在do_poll() 调用中阻塞,当被唤醒时,能够根据“信号”的 fd 使用正确的 FIFO。查看fs/select.c,了解如何调用do_poll()。
您可能希望使用互斥锁来保护 FIFO。