我正在使用USB ACM驱动程序,“我需要从内核空间向用户空间应用程序发送通知以调用回调函数”。我不太了解在代码中使用内核到用户界面。 sysfs如何帮助这种情况。请发送一些示例代码以使用sysfs,这样我就可以在我的代码中实现。我无处可寻。另外请告诉任何另一种简单的方法来实现内核到用户空间通知。提前谢谢。
答案 0 :(得分:1)
我的建议是为用户空间可以访问的内核驱动程序创建一个sysfs接口。如果使用正确的属性创建的每个sysfs属性都可以像用户空间中的文件一样读取。然后,您可以使用用户空间中的轮询功能来轮询该文件上的操作。要从内核空间触发此操作,可以在属性上使用sysfs_notify
函数,这将导致用户空间代码被唤醒。我就是这样做的
内核 1.创建Kobject或将属性附加到先前的kobject 2.当您想要在kobject和属性
上发信号通知用户空间时调用sysfs_notify用户空间
答案 1 :(得分:0)
另一种替代方法是使用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);