Linux内核模块中的内核线程之间的通信
问题描述:
我刚刚开始学习在Linux内核2.6上制作内核模块的技巧。我期望做的是有3个内核线程,称为从机,需要将数据发送到称为主机的第4个内核线程,并接收它们各自的响应。从站可以随时请求,这意味着我需要某种队列结构和一种将响应重定向到正确线程的方式。Linux内核模块中的内核线程之间的通信
首先我看着实现我自己的队列结构来排队传入的请求 - 但我怎么发出这个信号?我不希望主人继续投票(例如spinlocks/semaphores)。我有一种感觉,在线程之间有更好的沟通方式。
由于缺乏文档(以及公认的低级搜索技巧),我对如何实现这一点感到茫然。你能为我指出正确的方向吗?
答
您所面临的两个不同的问题:
- 的奴隶和主人之间的实际通信。您可以在内核中使用FIFO实现(
kernel/kfifo.c
)。 - 您需要对主站进行解复用,无需等待/轮询。你可以像用户空间一样通过“事件文件描述符”(eventfd)上的poll/epoll来完成它。查看
include/linux/eventfd.h
中的内核级API(实现位于fs/eventfd.h
)。
您应该为每个从属线程使用一个[kfifo,事件文件]对。主线程在do_poll()
调用中阻塞,唤醒时,能够根据“信号”的fd使用正确的FIFO。看看fs/select.c
了解如何拨打do_poll()
。
您可能想要使用互斥锁来保护FIFO。