【问题标题】:How to trap system calls in a userspace library in Linux?如何在 Linux 的用户空间库中捕获系统调用?
【发布时间】: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


【解决方案1】:

Linux 是一个单片内核,这意味着一般来说,您所要求的都是不可能的;您不能在用户模式下编写任意驱动程序。

可以(正如你的标题所暗示的那样),使用ptrace(2)trap系统调用,并且基本上将它们重定向到你的库中的函数。然而,这并不是一个简单直接的解决方案。

另见:

FUSE(用户空间中的文件系统)可能是您正在寻找的。这是一种允许通过用户空间进程专门实现文件系统驱动程序的机制。例如,sshfs 就是这样实现的。

资源:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2017-12-30
    • 2011-10-24
    • 2011-03-02
    • 2013-12-24
    相关资源
    最近更新 更多