在用户空间中实现Linux字符驱动程序

我正在尝试为embedded式Linux系统构build自定义游戏杆/手柄设备。 我正在寻找一个库或系统API,这将允许我在用户空间代码的/ dev / input中创build一个节点。

我想这是因为:

我明白制作内核模块的唯一方法是使用内核代码并将其编译为内核模块。 我不是试图用用户空间代码实现一个内核模块。

我正在寻找一个API,允许我创build一个文件,当这个文件被读取或写入,函数被调用。 这是angular色驱动程序的一般概念。 我不需要内核提供或施加的特权或限制。

必须有一些方法来模拟不涉及编写全新内核模块的文件I / O。

谢谢!

你不能。

“字符设备”是指内核中面向字符的接口。

你可以做LIUB建议的东西,并创建一个像内核一样的类似API的接口,将类似内核的API封装回用户空间,如果你确实需要在/dev/input生成HID风格的设备,你需要做类似的事情。

但是,如果您实际上不需要HID设备,并且由于它只是针对您的硬件, 并且您“不需要内核访问”,因为您实际上可以与来自用户空间的低级硬件通信,所以您可以考虑其他一些选项:

  • 您可以使用XSendEvent或XTEST协议来合成本地事件。
  • 您可以构建一个允许客户端连接的网络服务器(或使用多播unix域套接字高效分发数据的服务器)。
  • 如果真的只是read()你想要客户端,你可以使用fifo 。 当你的程序write()的数据包可以平分为PIPE_BUF (512字节)时,你可以保证它们不会被意外地插入到另一个数据包中。

您可以使用用户空间输入子系统来执行所需操作,请参阅:

http://thiemonge.org/getting-started-with-uinput

并举例说明:

http://pingus.seul.org/~grumbel/xboxdrv/

老问题,但我想我会添加一个珍闻,所以看这个人不会得到错误的想法。 在过去的3 – 4年,现在已经有了这个小框架,它被用来扩展FUSE文件系统的边缘,它提供了一个沙盒解决方案来完成问题的要求。

这就是所谓的CUSE,它允许字符驱动程序由在FUSE和CUSE在内核中打开的系统上的FUSE组成员实例化。 所需要的只是一个合适的应用程序(您的发行版中的OSS适配守护程序就是这样一个应用程序,FWIW …)

当时“你不能”的答案根本没有帮助,实际上并没有考虑问题,而是……呃……总体上是错误的 ……即使那样。

CUSE并没有像FUSE那么有吸引力,所以在那里做一些简单易用的绑定的帮助并不多,但它仍然存在。 是什么把我带到这个话题呢?如果有关于这个问题的话,我会寻找一个“更好的”答案。 答案是“是的,如果你可以做Python …”(pycuse) – 如果你不能在那里做Python,那么你是独立的。 那么…我从来没有接受过这样的事情…所以我要去pycuse学习,并做一个C ++ / Go /等。 绑定,因为我得到他们,需要一个新的我正在使用的语言在我需要的时间。

至于其余的…呃…下一次你的鸭子连续更多。 你当然没有在这一个。

尝试创建自己的字符设备,然后编写一个与驱动程序通信的用户空间应用程序(我建议在这种情况下使用netlink,因为当其他驱动程序不会导出符号时,它可能被用作后门程序,但是它们打开功能到用户空间,在这种情况下用户空间与netlink的帮助可以作为一个网关)。

在您的自定义字符设备中,您可以让用户告诉您要创建的设备的路径是什么。 即字符设备创建具有固定名称的初始字符设备,则用户应用程序可以使用netlink(或ioctl)来告诉该字符设备使用自定义名称创建另一个字符设备。

希望这可以帮助

您正在描述viewos虚拟机

http://wiki.virtualsquare.org/wiki/index.php/Main_Page

http://wiki.virtualsquare.org/wiki/index.php/UMview#modulees

这个虚拟机可以劫持每一个系统调用指向你的内核到你的用户空间模块(这被认为是使Linux不那么单一)

您使用$umview xterm命令启动一个umview实例

因此每个在新生成的xterm中运行的程序都会被跟踪

现在你可以简单地做(在​​一个umview实例中)a

 $um_add_service umdev $mount -t umdevJoystick none <your file, for example /dev/virtualJoystick> 

所以你可以写一个模块,可以拦截每个读/写/ …到你的/dev/virtualJoystick文件,做你想做的

(模块语法非常简单)

 static int joystick_read(char type, dev_t device, struct dev_info *di){ /*my operation...probably a XTestEvent() or something like that*/ } static int joystick_write(char type, dev_t device, struct dev_info *di){ /*my operation...probably a XTestEvent() or something like that*/ } /*...*/ struct umdev_operations umdev_ops={ /*hijacking table*/ .read=joystick_read, .write=joystick_write, }; 

(在umview源代码中的umdev_testmodules dir作为一个小教程非常有帮助!))

有了一些限制,您可以考虑使用LD_PRELOAD和库,可以覆盖对设备的常见调用。

在这里看到更多的细节