用户程序和 Linux 内核模块之间的通信有哪些选项?

发布于 2024-09-10 07:41:42 字数 195 浏览 4 评论 0原文

我是 Linux 内核模块编程的新手。从我目前阅读的材料来看,我发现用户程序有 3 种方式请求服务或与 Linux 内核模块通信

  1. /dev 中的设备文件
  2. /proc 文件系统中的文件
  3. ioctl() 调用

问题:对于用户程序和 Linux 内核模块之间的通信,我们还有哪些其他选项?

I am a new comer to Linux Kernel Module programming. From the material that I have read so far, I have found that there are 3 ways for a user program to request services or to communicate with a Linux Kernel Module

  1. a device file in /dev
  2. a file in /proc file system
  3. ioctl() call

Question: What other options do we have for communication between user program and linux kernel module?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

风情万种。 2024-09-17 07:41:43

基本上,许多标准 IPC 机制 — cf. http://en.wikipedia.org/wiki/Inter-process_communication - 可以使用:

  1. 文件和内存映射文件:设备文件(如上所述)或 /dev、procfs、sysfs、debugfs 中的类似特殊文件,或者您自己的文件系统、具有读/写、ioctl 的笛卡尔积、 mmap

  2. 可能的信号(与 kthread 一起使用)

  3. 套接字:使用选择的协议:TCP、UDP(参见knfsd,但可能不太容易)、PF_LOCAL 或 Netlink(许多子接口 - 基本 netlink、genetlink、Connector , ...)

此外,

 4。 系统调用(虽然不能真正从模块中使用)

5。 网络接口(类似于 tun)。

中找到。

  • Netlink 的工作示例(仅举几例)可以在git://git.netfilter.org/libmnl(用户空间端)
  • net/core/rtnetlink.c(基本 netlink)
  • net/netfilter/nf_conntrack_netlink.c (nfnetlink)
  • fs/quota/netlink.c (genetlink)

Basically, many standard IPC mechanisms — cf. http://en.wikipedia.org/wiki/Inter-process_communication — can be used:

  1. File and memory-mapped file: a device file (as above) or similarly special file in /dev, procfs, sysfs, debugfs, or a filesystem of your own, cartesian product with read/write, ioctl, mmap

  2. Possibly signals (for use with a kthread)

  3. Sockets: using a protocol of choice: TCP, UDP (cf. knfsd, but likely not too easy), PF_LOCAL, or Netlink (many subinterfaces - base netlink, genetlink, Connector, ...)

Furthermore,

 4. System calls (not really usable from modules though)

 5. Network interfaces (akin to tun).

Working examples of Netlink — just to name a few — can be found for example in

  • git://git.netfilter.org/libmnl (userspace side)
  • net/core/rtnetlink.c (base netlink)
  • net/netfilter/nf_conntrack_netlink.c (nfnetlink)
  • fs/quota/netlink.c (genetlink)
温暖的光 2024-09-17 07:41:43

这个 Linux 文档给出了内核和用户空间交互的一些方式(通信)。他们是以下几位。

  • Procfssysfs 和类似机制。这还包括 /dev 条目,以及内核空间在用户空间中公开文件的所有方法(/proc、/dev 等条目基本上是从内核空间公开的文件)。
  • 基于Socket 的机制。 Netlink 是一种套接字,专门用于用户空间和内核空间之间的通信。
  • 系统调用
  • 上行调用。内核在用户空间执行代码。例如产生一个新进程。
  • mmap - 将内核内存区域映射到用户空间的内存。这允许内核和用户空间读/写同一内存区域。

除此之外,下面的列表还添加了一些我所知道的其他机制。

  • 中断。用户空间可以引发中断来与内核空间对话。例如,某些 CPU 使用 int80 进行系统调用(而其他 CPU 可能使用不同的机制,例如 syscall 指令)。内核必须提前定义相应的中断处理程序。
  • vDSO/vsyscall - 这些是 Linux 内核中用于优化某些系统调用执行的机制。其想法是拥有一个共享内存区域,当进程进行系统调用时,用户空间库从该区域获取数据,而不是实际调用相应的系统调用。这节省了上下文切换开销。

This Linux document gives some of the ways in which the kernel and user space can interact(communicate). They are the following.

  • Procfs, sysfs, and similar mechanisms. This includes /dev entries as well, and all the methods in which kernel space exposes a file in user space (/proc, /dev, etc. entries are basically files exposed from the kernel space).
  • Socket based mechanisms. Netlink is a type of socket, which is meant specially for communication between user space and kernel space.
  • System calls.
  • Upcalls. The kernel executes a code in user space. For example spawning a new process.
  • mmap - Memory mapping a region of kernel memory to user space. This allows both the kernel, and the user space to read/write to the same memory area.

Other than these, the following list adds some other mechanisms I know.

  • Interrupts. The user space can raise interrupts to talk to kernel space. For example some CPUs use int80 to make system calls (while others may use a different mechanism like syscall instruction). The kernel has to define the corresponding interrupt handler in advance.
  • vDSO/vsyscall - These are mechanisms in Linux kernel to optimize execution of some system calls. The idea is to have a shared memory region, and when a process makes a system call, the user space library gets data from this region, instead of actually calling the corresponding system call. This saves context switch overhead.
失而复得 2024-09-17 07:41:43
停顿的约定 2024-09-17 07:41:42

您的选项 3) 实际上是选项 1) 的子选项 - ioctl() 是与设备文件交互的一种方式(read()write () 是通常的方式)。

另外两种值得考虑的方法是:

  • sysfs 文件系统;
  • Netlink 套接字。

Your option 3) is really a sub-option of option 1) - ioctl() is one way of interacting with a device file (read() and write() being the usual ways).

Two other ways worth considering are:

  • The sysfs filesystem;
  • Netlink sockets.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文