我想在用户和内核空间之间构造两个共享队列(一个命令队列和一个回复队列)。这样内核就可以向用户空间发送消息,用户空间在完成处理后可以向内核发送回复。我所做的是使用为用户空间分配内核内存页面(用于队列)和mmap,现在用户和内核都可以访问这些页面(这里我指的是在内核空间中写入的内容可以正确读取在用户空间中,或反之亦然)。内核/用户地址空间之间共享的无锁队列
问题是我不知道如何在内核和用户空间之间同步访问。假设我要为多制造商1用户方案构建环形缓冲区,那么如何使这些环形缓冲区访问不会被同时写入损坏?
本周我做了一些研究,这里有一些可能的方法,但我在内核模块开发方面颇为新颖,不太确定它是否可行。当挖掘到他们,我会很高兴,如果我能得到的任何意见或建议:用户/内核空间之间
使用共享信号:Shared semaphore between user and kernel spaces
但许多系统调用像sem_timedwait()会使用,我很担心它的效率。
我真正喜欢的是一个无锁方案,如https://lwn.net/Articles/400702/中所述。相关文件内核树是:
- 内核/跟踪/ ring_buffer_benchmark.c
- 内核/跟踪/ ring_buffer.c
- 文档/跟踪/环形缓冲区design.txt
是如何实现无锁的记录在这里:https://lwn.net/Articles/340400/
不过,我认为这些是内核实现,不能直接在用户空间中使用(如ring_buffer_benchmark.c中的示例)。有什么方法可以在用户空间中重用这些方案吗?也希望我能找到更多的例子。
同样在那篇文章(lwn 40072)中,提到了一种使用perf工具的替代方法,这与我正在尝试做的似乎很相似。如果2不行,我会尝试这种方法。
的用户空间PERF工具因此与 内核交互通过读出并在共享存储器区域,而无需使用系统调用 写入。
对不起,我的英语语法...希望它是有意义的。
嗨Tsyvarev。是的,具有内存边界的循环缓冲区看起来像更多。直截了当的解决方案!我会试试看看它是如何工作的! 非常感谢 – Fengggli
如果头指针在内核空间(生产者)中定义并且尾指针在用户空间(消费者)中定义,那就好了。如果存在生产/消费操作,则头/尾指针仍然耦合在一起,例如: – Fengggli
例如: 在生产者端仍然需要尾部信息: > if(CIRC_SPACE(head,tail,buffer->大小)> = 1) 这是否表明,每当生产者想要写入循环缓冲区时,它都必须获取最新的尾指针值?似乎我应该把这两个指针放在共享空间中。 – Fengggli