【问题标题】:How to send Notification from Kernel to user space application using SYSFS如何使用 SYSFS 从内核向用户空间应用程序发送通知
【发布时间】:2018-10-14 23:25:25
【问题描述】:

我正在使用 USB ACM 驱动程序,“我需要将通知从内核空间发送到用户空间应用程序以调用回调函数”。我不太了解在代码中使用内核到用户界面。 sysfs 对这种情况的帮助有多大。请发送一些示例代码以使用 sysfs,以便我了解在我的代码中实现的想法。我在任何地方都找不到它。另外请告诉任何其他简单的方法来实现内核到用户空间的通知。提前致谢。

【问题讨论】:

标签: linux-kernel usb linux-device-driver sample userspace


【解决方案1】:

我的建议是为您的内核驱动程序创建一个用户空间可以访问的 sysfs 接口。如果使用正确的属性创建每个 sysfs 属性,则可以像从用户空间中读取文件一样读取。然后,您可以使用用户空间的 poll 函数来轮询对该文件的操作。要从内核空间触发此操作,您可以在属性上使用sysfs_notify 函数,它将导致您的用户空间代码唤醒。这是我的做法

内核 1.创建Kobject或将属性附加到先前的kobject 2. 当你想在 kobject 和属性上调用用户空间调用 sysfs_notify 时

用户空间

  1. 创建一个在等待 sysfs_notify 时将阻塞的新线程
  2. 从此线程打开 sysfs 属性
  3. 轮询属性,一旦内核中的 sysfs_notify 被调用,它将取消阻止您的轮询
  4. 调用您的事件处理函数

【讨论】:

  • 请注意,sysfs notify 不能从中断上下文中调用,因此如果您的事件是中断,则需要创建某种类型的延迟工作。您还可以使用 sysfs_dirent 接口,它会为您处理延迟的工作
【解决方案2】:

另一种选择是使用eventfd。您创建 eventfd,将整数文件描述符传递给内核空间(例如通过 sysfs 或 ioctl),然后将从用户空间获得的文件描述符转换为内核空间中的 eventfd_ctx。就是这样 - 你有你的通知渠道。

用户空间

#include <sys/eventfd.h>

int efd = eventfd(0, 0);
// pass 'efd' to kernel space

内核空间

#include <linux/eventfd.h>

// Set up
int efd = /* get from user space - sysfs/ioctl/write/... */;
struct eventfd_ctx* efd_ctx = eventfd_ctx_fdget(efd);

// Signal user space
eventfd_signal(efd_ctx, 1);

// Tear down
eventfd_ctx_put(efd_ctx);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2020-02-26
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多