代码之家  ›  专栏  ›  技术社区  ›  Makis

在Linux中,是否可以从内核空间调用用户空间回调函数(ioctl)?

  •  7
  • Makis  · 技术社区  · 15 年前

    我特别想用用户可控制的方式处理流,但在内核中处理。这些操作可以附加到内核模块,但这将使开发变得更加容易,因为我不需要在开发过程中弄乱内核。

    更具体地说,这将是一个过程:

    1. 驱动程序将数据读入缓冲区。
    2. 一些更多的处理被完成,可能与一些硬件块。
    3. 数据由用户空间应用程序使用。
    3 回复  |  直到 15 年前
        1
  •  8
  •   hlovdal    15 年前

    我认为,通过让驱动程序提供一个或多个用户空间应用程序打开的字符设备(或块设备),您可以实现所需的功能。

    那你可以用 inotify linux journal article )对于内核->用户空间事件通信。Ioctl或向设备写入用户空间->内核事件通信。数据交换也可以通过读/写一个或多个设备文件来实现。

    或者,您可以提供/proc或/sys文件系统条目或使用netlink。

    你也可以考虑 ksocket

    Ksocket是一个linux 2.6内核模块 听,连接,接受,…) 内核开发人员 linux内核中的网络编程 空间。 ksocket提供的接口与它们的等效接口基本相同 在glibc中,即使是新的开发者 内核空间将没有障碍 开发核心网络相关

        2
  •  4
  •   Bernd Jendrissek    15 年前

    我认为您要求的是一个正方形的圆:如果内核直接执行“userland”函数,那么它就不是“userland”,而是一个自制的可加载模块系统。我想你 want是一种解决方法,它可以让你在每次出错时都不致于崩溃。也许你可以滥用信号处理程序作为“回调”的手段,但我太生疏了,不能指出你会得到什么 返回 就像通过函数调用返回内核一样。这里的问题是,在任何用户区->内核上下文切换时,内核以一个新堆栈开始,因此返回地址早就不存在了。如果您将一个信号处理程序与mmap'ing/dev/mem结合起来,让您的userland伪驱动程序直接戳到内核模式驱动程序的数据结构,怎么样?但是当你犯错的时候,你又重新启动了,除非你知道怎么去mmap 只有 你司机的数据结构?其他可重用的机制可能是流和TTY-line规程;我认为这些赋予了某种变形能力。当然,作为一个永久的解决方案,这些都不是一个好主意!

        3
  •  2
  •   Andy Grover    15 年前

    你的用例总是提到数据。

    也许您想做的是在内核和用户进程之间共享内存。您可以将数据和/或命令放入共享内存,另一端的进程/内核代码可以读取数据和/或执行任何操作。get\u user\u pages\u fast()调用可以使内核访问进程的内存,即使进程当前没有运行。