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

Linux kernel 在Linux中,是否可以从内核空间调用用户空间回调函数(ioctl)?,linux-kernel,kernel,linux-device-driver,ioctl,Linux Kernel,Kernel,Linux Device Driver,Ioctl,是否可以在Linux中扩展ioctl接口,以便用户空间应用程序可以向内核空间驱动程序发送指向函数的指针 我特别考虑以用户可控制的方式处理流,但在内核中执行。这些操作可以附加到内核模块,但这将使开发变得更加容易,因为在开发过程中我不需要弄乱内核 更具体地说,这将是一个过程: 数据由驱动程序读取到缓冲区 数据由这些用户定义的函数就地处理 完成更多处理,可能使用一些硬件块 数据由用户空间应用程序使用 我认为,通过让驱动程序提供一个或多个用户空间应用程序打开的字符设备(或块设备),您可以实现所需的功能

是否可以在Linux中扩展ioctl接口,以便用户空间应用程序可以向内核空间驱动程序发送指向函数的指针

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

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

  • 数据由驱动程序读取到缓冲区
  • 数据由这些用户定义的函数就地处理
  • 完成更多处理,可能使用一些硬件块
  • 数据由用户空间应用程序使用

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

    然后可以使用()进行内核->用户空间事件通信。Ioctl或写入设备以进行用户空间->内核事件通信。数据交换也可以通过读取/写入一个或多个设备文件来实现

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

    你也可以考虑:

    Ksocket是linux 2.6内核模块 它提供bsd样式的套接字 接口(即套接字、绑定、, 倾听、连接、接受……)的 内核开发人员,以方便他们的 linux内核中的网络编程 空间 ksocket提供的接口与其等效接口基本相同 在glibc中,即使是新开发人员 内核空间将没有障碍 开发与网络相关的内核 程序


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

    您的用例不断提到数据


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

    在内核空间运行用户提供的代码会在系统中打开一个巨大的安全漏洞。我知道,但即使这只是用于初始开发,它也会非常有用。@我认为他不想在内核上下文中运行用户模式代码,而是想从用户代码调用他的系统调用,传递回调处理程序指针,内核在每次调用时返回用户模式,因此,从用户代码的角度来看,它看起来就像是常规回调。这正是我所想的,j_kubik。好吧,显然我可以将数据发回,但如果我们谈论高速通信(比如音频数据)这将有助于将大量数据复制到各处……我始终可以在虚拟机中运行开发系统,因此崩溃并不是真正的问题。