8

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

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

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

  1. 驱动程序将数据读取到缓冲区。
  2. 数据由这些用户定义的函数处理。
  3. 完成了更多处理,可能使用一些硬件块。
  4. 数据由用户空间应用程序使用。
4

3 回答 3

9

我认为你可以通过让你的驱动程序提供一个或多个用户空间应用程序打开的字符设备(或块设备)来实现你想要的。

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

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

您也可以考虑ksocket

Ksocket 是一个 linux 2.6 内核模块,它为内核开发人员提供 bsd 风格的套接字接口(即 socket、bind、listen、connect、accept...),以方便他们在 linux 内核空间中进行网络编程。ksocket 提供的接口与 glibc 中的等效接口非常相似,因此即使是内核空间的新开发人员也可以毫无障碍地开发与内核网络相关的程序。

于 2010-04-22T11:43:30.067 回答
3

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

于 2010-04-24T01:40:14.650 回答
2

您的用例不断提及数据。

Maybe what you want to do is share memory between the kernel and a user process. You could put data and/or commands into the shared memory, and the process/kernel code on the other side could read it and do whatever. The get_user_pages_fast() call can make a process's memory accessible to the kernel, even when the process is not currently running.

于 2010-05-05T05:27:49.297 回答