我是Linux内核模块编程的新成员。从我迄今阅读材料,我已经发现,有3种方式为用户程序来请求服务或/ dev中 我们对用户程序和Linux内核模块之间的通信有什么选择?
- 设备文件进行通信在/ proc文件系统
- ioctl()调用
问题:我们对用户程序和Linux内核模块之间的通信有什么其他选择?
我是Linux内核模块编程的新成员。从我迄今阅读材料,我已经发现,有3种方式为用户程序来请求服务或/ dev中 我们对用户程序和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(CF 。knfsd
,但可能不会太容易),PF_LOCAL,或网络链路(多子接口 - 基础网络链路,genetlink,连接器,...)
此外,
4. 系统调用(不虽然真的可以使用)
5. 网络接口(类似于tun)。 //git.netfilter.org/libmnl(用户空间侧)
工作网络链路的例子 - - 仅举几可以在例如
您的权利链接包含大量有用的信息,但链接不是答案。请参阅http://stackoverflow.com/questions/how-to-answer这解释了为什么简单链接不是我们想要的。 – stsquad 2012-01-12 12:32:06
我回答了你的“”我们有什么其他的选择用于用户程序和linux内核模块之间的通信?“”问题的一部分..如果你问了其他选项,它们是如何工作的,我会写几个关于他们的网页,我为什么给你这个链接,因为它有他们的工作实例,我认为这是自我解释。 – Santi1986 2012-01-16 10:09:07
由于stackoverflow页面解释了外部页面的链接可能是暂时的。如果链接页面消失,答案突然变得毫无用处。没有人建议你需要写一篇文章,但总结选项会使它成为一个更有用的答案。 – stsquad 2012-01-16 14:30:12
This Linux document给出了一些的,其中内核和用户空间可以互动的方式(通信)。他们是以下。
Procfs
,sysfs
和类似的机制。这也包括/dev
条目,以及内核空间在用户空间中公开文件的所有方法(/ proc,/ dev等等,条目基本上是从内核空间公开的文件)。Socket
based mechanisms。 Netlink
是一种套接字,专门用于用户空间和内核空间之间的通信。System calls
。Upcalls
。内核在用户空间中执行代码。例如产生一个新的过程。mmap
- 存储器映射内核存储器的区域到用户空间。这允许内核和用户空间读/写同一个内存区域。除了这些,下面的列表中增加了我知道的一些其他机制。
Interrupts
。用户空间可以引发中断与内核空间通信。例如,一些CPU使用int80
进行系统调用(而其他CPU可能使用不同的机制,如syscall
指令)。内核必须事先定义相应的中断处理程序。vDSO/vsyscall
- 这些都是在Linux内核机制以优化一些系统调用的执行。这个想法是有一个共享内存区域,当进程进行系统调用时,用户空间库从该区域获取数据,而不是实际调用相应的系统调用。这节省了上下文切换开销。
网络链路插座看好,但一直没能找到它使用的netlink套接字工作的例子。管理写我自己但仍然很多问题没有答案。 – binW 2010-07-23 11:18:03