9

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

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

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

4

5 回答 5

10

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

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

  • 文件系统sysfs
  • 网络链接套接字。
于 2010-07-20T13:57:24.460 回答
6

基本上,许多标准的 IPC 机制——参见。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(基本网络链接)
  • 网络/netfilter/nf_conntrack_netlink.c (nfnetlink)
  • fs/quota/netlink.c (genetlink)
于 2010-11-21T14:06:12.107 回答
4

这包括所有类型的例子:)

http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html

于 2012-01-11T09:16:46.983 回答
2

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

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

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

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