![]() |
1
8
我认为,通过让驱动程序提供一个或多个用户空间应用程序打开的字符设备(或块设备),您可以实现所需的功能。 那你可以用 inotify linux journal article )对于内核->用户空间事件通信。Ioctl或向设备写入用户空间->内核事件通信。数据交换也可以通过读/写一个或多个设备文件来实现。 或者,您可以提供/proc或/sys文件系统条目或使用netlink。 你也可以考虑 ksocket
|
![]() |
2
4
我认为您要求的是一个正方形的圆:如果内核直接执行“userland”函数,那么它就不是“userland”,而是一个自制的可加载模块系统。我想你 want是一种解决方法,它可以让你在每次出错时都不致于崩溃。也许你可以滥用信号处理程序作为“回调”的手段,但我太生疏了,不能指出你会得到什么 返回 就像通过函数调用返回内核一样。这里的问题是,在任何用户区->内核上下文切换时,内核以一个新堆栈开始,因此返回地址早就不存在了。如果您将一个信号处理程序与mmap'ing/dev/mem结合起来,让您的userland伪驱动程序直接戳到内核模式驱动程序的数据结构,怎么样?但是当你犯错的时候,你又重新启动了,除非你知道怎么去mmap 只有 你司机的数据结构?其他可重用的机制可能是流和TTY-line规程;我认为这些赋予了某种变形能力。当然,作为一个永久的解决方案,这些都不是一个好主意! |
![]() |
3
2
你的用例总是提到数据。 也许您想做的是在内核和用户进程之间共享内存。您可以将数据和/或命令放入共享内存,另一端的进程/内核代码可以读取数据和/或执行任何操作。get\u user\u pages\u fast()调用可以使内核访问进程的内存,即使进程当前没有运行。 |