我正在使用 USB ACM 驱动程序,“我需要将通知从内核空间发送到用户空间应用程序以调用回调函数”。我不太了解在代码中使用内核到用户界面。sysfs 对这种情况的帮助有多大。请发送一些示例代码以使用 sysfs,以便我了解在我的代码中实现的想法。我在任何地方都找不到它。另外请告诉任何其他简单的方法来实现内核到用户空间的通知。提前致谢。
问问题
2865 次
2 回答
1
我的建议是为您的内核驱动程序创建一个用户空间可以访问的 sysfs 接口。如果使用正确的属性创建每个 sysfs 属性,则可以像从用户空间中读取文件一样读取。然后,您可以使用用户空间的 poll 函数来轮询对该文件的操作。要从内核空间触发此操作,您可以sysfs_notify
在属性上使用该函数,它将导致您的用户空间代码唤醒。这是我会怎么做
内核 1. 创建 Kobject 或将属性附加到先前的 kobject 2. 当您想向用户空间发出信号时,请在 kobject 和属性上调用 sysfs_notify
用户空间
- 创建一个在等待 sysfs_notify 时将阻塞的新线程
- 从这个线程打开 sysfs 属性
- 轮询属性,一旦调用内核中的 sysfs_notify ,它将取消阻止您的轮询
- 调用你的事件处理函数
于 2015-08-04T20:01:58.747 回答
1
另一种选择是使用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);
于 2018-10-14T15:25:25.470 回答