0

我想在用户和内核空间之间构造两个共享队列(一个命令队列和一个回复队列)。这样内核就可以向用户空间发送消息,用户空间在完成处理后可以向内核发送回复。我所做的是使用为用户空间分配内核内存页面(用于队列)和mmap,现在用户和内核都可以访问这些页面(这里我指的是在内核空间中写入的内容可以正确读取在用户空间中,或反之亦然)。内核/用户地址空间之间共享的无锁队列

问题是我不知道如何在内核和用户空间之间同步访问。假设我要为多制造商1用户方案构建环形缓冲区,那么如何使这些环形缓冲区访问不会被同时写入损坏?

本周我做了一些研究,这里有一些可能的方法,但我在内核模块开发方面颇为新颖,不太确定它是否可行。当挖掘到他们,我会很高兴,如果我能得到的任何意见或建议:用户/内核空间之间

  1. 使用共享信号:Shared semaphore between user and kernel spaces

    但许多系统调用像sem_timedwait()会使用,我很担心它的效率。

  2. 我真正喜欢的是一个无锁方案,如https://lwn.net/Articles/400702/中所述。相关文件内核树是:

    • 内核/跟踪/ ring_buffer_benchmark.c
    • 内核/跟踪/ ring_buffer.c
    • 文档/跟踪/环形缓冲区design.txt

    是如何实现无锁的记录在这里:https://lwn.net/Articles/340400/

    不过,我认为这些是内核实现,不能直接在用户空间中使用(如ring_buffer_benchmark.c中的示例)。有什么方法可以在用户空间中重用这些方案吗?也希望我能找到更多的例子。

  3. 同样在那篇文章(lwn 40072)中,提到了一种使用perf工具的替代方法,这与我正在尝试做的似乎很相似。如果2不行,我会尝试这种方法。

    的用户空间PERF工具因此与 内核交互通过读出并在共享存储器区域,而无需使用系统调用 写入。

对不起,我的英语语法...希望它是有意义的。

回答

0

对于内核和用户空间之间的同步,您可以使用曲线缓冲区机制(文档位于Documentation/circular-buffers.txt)。

这样的缓冲区的关键因素是两个指针(头部和尾部),它们可以单独更新,这非常适合分离的用户和内核代码。而且,循环缓冲区的实现非常简单,所以在用户空间中实现并不困难。

请注意,对于内核中的多个生产者,您需要将它们与spinlock或类似的同步。

+0

嗨Tsyvarev。是的,具有内存边界的循环缓冲区看起来像更多。直截了当的解决方案!我会试试看看它是如何工作的! 非常感谢 – Fengggli

+0

如果头指针在内核空间(生产者)中定义并且尾指针在用户空间(消费者)中定义,那就好了。如果存在生产/消费操作,则头/尾指针仍然耦合在一起,例如: – Fengggli

+0

例如: 在生产者端仍然需要尾部信息: > if(CIRC_SPACE(head,tail,buffer->大小)> = 1) 这是否表明,每当生产者想要写入循环缓冲区时,它都必须获取最新的尾指针值?似乎我应该把这两个指针放在共享空间中。 – Fengggli

相关问题