Linux kernel 对于用户程序和Linux内核模块之间的通信,我们有哪些选项?

Linux kernel 对于用户程序和Linux内核模块之间的通信,我们有哪些选项?,linux-kernel,linux-device-driver,kernel-module,Linux Kernel,Linux Device Driver,Kernel Module,我是Linux内核模块编程的新手。从我到目前为止阅读的材料中,我发现用户程序有3种方式来请求服务或与Linux内核模块通信 /dev中的设备文件 /proc文件系统中的文件 ioctl()调用 问:对于用户程序和linux内核模块之间的通信,我们还有哪些其他选项?您的选项3)实际上是选项1的子选项)ioctl()是与设备文件交互的一种方式(read()和write()是常用方式) 另外两种值得考虑的方法是: sysfs文件系统 网络链接套接字 基本上,可以使用许多标准IPC机构-cf.: 文件

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

  • /dev中的设备文件
  • /proc文件系统中的文件
  • ioctl()调用
  • 问:对于用户程序和linux内核模块之间的通信,我们还有哪些其他选项?

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

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

    • sysfs
      文件系统
    • 网络链接套接字

    基本上,可以使用许多标准IPC机构-cf.:

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

  • 可能是信号(用于kthread)

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

  • 此外,

    四,。系统调用(但不能从模块中真正使用)

    五,。网络接口(类似于tun)

    Netlink的工作示例(仅举几个例子)可以在中找到,例如

    • git://git.netfilter.org/libmnl (用户空间端)
    • net/core/rtnetlink.c(基本netlink)
    • net/netfilter/nf_conntrack_netlink.c(nfnetlink)
    • fs/quota/netlink.c(genetlink)

      • 这包括所有类型和示例:)

        给出了内核和用户空间可以交互(通信)的一些方式。它们如下

        • Procfs
          sysfs
          ,以及类似的机制。这还包括
          /dev
          条目,以及内核空间在用户空间中公开文件的所有方法(/proc、/dev等。条目基本上是从内核空间公开的文件)
        • 基于套接字的机制
          Netlink
          是一种套接字,专门用于用户空间和内核空间之间的通信
        • 系统调用
        • 向上调用
          。内核在用户空间中执行代码。例如,生成一个新进程
        • mmap
          -将内核内存区域映射到用户空间的内存。这允许内核和用户空间读/写相同的内存区域
        除此之外,下面的列表添加了一些我知道的其他机制

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

        所有可运行的示例

        太多的话让我厌烦

        • 文件操作:

          • :

            • 。另见:
            • 。另见:
            • 。另见:
            • 。另见:
            • 。另见:
            • 。另见:
            • 。另见:
            • 。另见:
        • 。另见:


        Netlink套接字看起来很有希望,但尚未找到使用Netlink套接字的工作示例。我自己写了一些问题,但仍然有很多问题没有回答。@binW我还链接了一个可运行的示例:Socket vs
        poll
        ask at:Your right该链接包含很多有用的信息,但链接不是答案。请看哪一个解释了为什么普通链接不是SO想要的。我回答了你的“用户程序和linux内核模块之间的通信还有哪些其他选项?”,这是问题的一部分。如果你问了其他选项以及它们是如何工作的,我会写几页关于它们的,我之所以给你这个链接,是因为它有工作示例,我认为这是不言自明的。正如stackoverflow页面所解释的,指向外部页面的链接可能是暂时的。如果“链接到”页面消失,答案会突然变得无用。没有人建议你需要写一篇文章,但是总结一下选项会让它成为一个更有用的答案。这是一个死链接。@Qeek学术页面是最容易断开的:-)这里有一堆永远不会断开的GitHub+堆栈交换链接: