2010-07-20 40 views
6

我是Linux内核模块编程的新成员。从我迄今阅读材料,我已经发现,有3种方式为用户程序来请求服务或/ dev中 我们对用户程序和Linux内核模块之间的通信有什么选择?

  • 将文件与Linux内核模块

    1. 设备文件进行通信在/ proc文件系统
    2. ioctl()调用

    问题:我们对用户程序和Linux内核模块之间的通信有什么其他选择?

  • 回答

    6

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

    两个值得考虑其他的方法是:

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

    网络链路插座看好,但一直没能找到它使用的netlink套接字工作的例子。管理写我自己但仍然很多问题没有答案。 – binW 2010-07-23 11:18:03

    6

    基本上,许多标准的IPC机制 - 比较。 http://en.wikipedia.org/wiki/Inter-process_communication - 可用于:

    1. 文件和存储器映射的文件:设备文件(如上述)或类似的特殊文件中的/ dev,PROCFS,sysfs中,debugfs,或自己的文件系统,笛卡儿积具有读/写,IOCTL,MMAP

    2. 可能信号(使用与KTHREAD)

    3. 套接字:使用所选择的协议:TCP,UDP(CF 。knfsd,但可能不会太容易),PF_LOCAL,或网络链路(多子接口 - 基础网络链路,genetlink,连接器,...)

    此外,

    4. 系统调用(不虽然真的可以使用)

    5. 网络接口(类似于tun)。 //git.netfilter.org/libmnl(用户空间侧)

  • 净/核心/的rtnetlink:

    工作网络链路的例子 - - 仅举几可以在例如

    • GIT中找到.c(base netlink)
    • net/netfilter/nf_conntrack_netlink.c(nfnetlink)
    • fs/quota/netlink。C(genetlink)
  • 3
    +1

    您的权利链接包含大量有用的信息,但链接不是答案。请参阅http://stackoverflow.com/questions/how-to-answer这解释了为什么简单链接不是我们想要的。 – stsquad 2012-01-12 12:32:06

    +0

    我回答了你的“”我们有什么其他的选择用于用户程序和linux内核模块之间的通信?“”问题的一部分..如果你问了其他选项,它们是如何工作的,我会写几个关于他们的网页,我为什么给你这个链接,因为它有他们的工作实例,我认为这是自我解释。 – Santi1986 2012-01-16 10:09:07

    +1

    由于stackoverflow页面解释了外部页面的链接可能是暂时的。如果链接页面消失,答案突然变得毫无用处。没有人建议你需要写一篇文章,但总结选项会使它成为一个更有用的答案。 – stsquad 2012-01-16 14:30:12

    1

    This Linux document给出了一些的,其中内核和用户空间可以互动的方式(通信)。他们是以下。

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

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

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