我是 Linux 内核模块编程的新手。从我目前阅读的材料中,我发现用户程序有 3 种方式请求服务或与 Linux 内核模块通信
- /dev 中的设备文件
- /proc 文件系统中的文件
- ioctl() 调用
问题:我们还有哪些其他选项可用于用户程序和 linux 内核模块之间的通信?
我是 Linux 内核模块编程的新手。从我目前阅读的材料中,我发现用户程序有 3 种方式请求服务或与 Linux 内核模块通信
问题:我们还有哪些其他选项可用于用户程序和 linux 内核模块之间的通信?
您的选项 3) 实际上是选项 1) 的子选项 -ioctl()
是与设备文件交互的一种方式(read()
并且write()
是通常的方式)。
另外两个值得考虑的方法是:
sysfs
;基本上,许多标准的 IPC 机制——参见。http://en.wikipedia.org/wiki/Inter-process_communication — 可以使用:
文件和内存映射文件:设备文件(如上)或 /dev、procfs、sysfs、debugfs或您自己的文件系统中的类似特殊文件,具有读/写、ioctl、mmap的笛卡尔积
可能是信号(用于 kthread)
套接字:使用选择的协议:TCP、UDP(参见knfsd
,但可能不太容易)、PF_LOCAL 或 Netlink(许多子接口 - 基本 netlink、genetlink、Connector ......)
此外,
4.系统调用(虽然不能从模块中真正使用)
5.网络接口(类似于 tun)。
Netlink 的工作示例(仅举几例)可以在例如
一切的可运行示例
太多的谈话让我感到无聊!
文件操作:
open
, read
, write
, close
,lseek
. 另请参阅:如何将轮询功能添加到内核模块代码?poll
. 另请参阅:如何使用 ioctl() 来操作我的内核模块?ioctl
. 另请参阅:如何使用 ioctl() 来操作我的内核模块?mmap
. 另请参阅:如何将 Linux 内核缓冲区映射到用户空间?这个 Linux 文档给出了内核和用户空间可以交互(通信)的一些方式。他们是以下。
Procfs
, sysfs
, 和类似的机制。这也包括/dev
条目,以及内核空间在用户空间中公开文件的所有方法(/proc、/dev 等条目基本上是从内核空间公开的文件)。Socket
基于机制。Netlink
是一种套接字,专门用于用户空间和内核空间之间的通信。System calls
.Upcalls
. 内核在用户空间执行代码。例如产生一个新进程。mmap
- 将内核内存区域映射到用户空间的内存。这允许内核和用户空间读取/写入相同的内存区域。除了这些,下面的列表还添加了一些我知道的其他机制。
Interrupts
. 用户空间可以引发中断以与内核空间对话。例如,一些 CPU 用于int80
进行系统调用(而其他 CPU 可能使用不同的机制,如syscall
指令)。内核必须提前定义相应的中断处理程序。vDSO/vsyscall
- 这些是 Linux 内核中用于优化某些系统调用执行的机制。这个想法是有一个共享内存区域,当一个进程进行系统调用时,用户空间库从这个区域获取数据,而不是实际调用相应的系统调用。这节省了上下文切换开销。