【发布时间】:2015-09-28 22:00:18
【问题描述】:
我需要在用户空间编写一个 linux 设备驱动程序。
我如何编写一个库,当链接到应用程序时,它可以处理对特定设备的系统调用。
应用程序应该能够在/dev/mydev0 等设备上使用open()、read()、write()、ioctl(),但这些调用应该在用户空间库而不是内核模块中终止。
请告知这是否可行以及如何实现。
【问题讨论】:
-
您可以使用通常的
LD_PRELOAD技巧来捕获此类系统调用的 C 包装器;您不能直接捕获int 80/sysenter指令(即,如果有人“手动”调用系统调用,而不通过 libc 包装器)。 -
嗨,您能详细说明一下这些 LD_PRELOAD “技巧”是如何工作的吗?那可能是我可以使用的东西。
-
使用 LD_PRELOAD 来捕获 library 调用非常复杂,尤其是在您尝试捕获所有 IO 调用时——那是在您开始考虑可能的多线程调用程序之前.除非你必须这样做,否则你不想走那条路。因为如果一个程序直接进行 system 调用,你就无法真正捕获这些调用,正如@MatteoItalia 已经发布的那样。
-
根据 LD_PRELOAD 提示,我偶然发现了类似 linux-projects.org/modules/sections/… 的内容。用用户空间编写的 video4linux 摄像头驱动框架。它还使用 LD_PRELOAD 来提供一些功能。不幸的是,它的源代码没有发布。我正在尝试编写一些非常相似的东西(提供 v4l2 支持的相机模块驱动程序)。
标签: linux linux-kernel linux-device-driver