从内核空间执行用户空间函数

即时通讯在Linux中写一个自定义的设备驱动程序,必须能够非常迅速地响应中断。 处理这个问题的代码已经存在于用户空间的实现中,但是这太慢了,因为它依靠软件不断地检查中断线的状态。 经过一番研究,我发现你可以从一个内核模块注册这些中断线,并执行一个由函数指针给出的函数。 然而,我们要执行的代码是在用户空间中,有没有办法从内核空间模块调用用户空间的函数?

由于内核不调用内核的用户空间函数,所以你不太好运,更不要说单个用户空间的应用函数和逻辑,更不用说每个用户空间的应用程序都有自己的内存布局,没有其他进程和内核被允许以这种方式入侵(共享对象是这里的例外,但是你仍然不能从内核空间中进入)。 那么安全模型呢,你不应该首先在内核上下文中运行用户空间代码(在内核上下文中自动被认为是不安全的代码),因为这会破坏内核的安全模型那一瞬间。 现在考虑上面提到的所有内容,再加上许多其他动机,您可能需要重新考虑您的方法,并将重点放在内核< – >用户空间IPC和接口 ,文件系统或用户模式帮助程序API(请阅读下文)上。

您可以从内核调用用户空间应用程序,即使用usermode-helper API 。 下面的IBM DeveloperWorks文章应该让你开始使用usermode-helper Linux内核API:

内核API,第1部分:从内核调用用户空间应用程序

我想最简单的方法是注册一个字符设备,当设备有一些数据时就准备好了。

任何试图从这个设备读取的进程,然后进入睡眠,直到设备准备好,然后醒来,在这一点上,它可以做适当的事情。

如果你只是想表示准备好,读者可以只读一个空字节。

用户空间程序然后只需要执行一个阻塞的read()调用,并被适当地阻塞,直到你唤醒它。

你将需要了解内核调度程序的等待队列机制来使用它。

听起来像你的中断线已经可以通过gpiolib用户空间? (/ SYS /班/ GPIO / …)

如果gpio边缘触发和poll()足够快,你有基准吗? 这样,你不必轮询用户空间应用程序的状态,但边缘触发将通过poll()报告。 请参阅内核源代码中的Documentation / gpio.txt。

如果通过sysfs的边缘触发不够好,那么正确的方法是开发一个内核驱动程序来处理时间关键部分,并通过API(sysfs,device node等)将结果导出到用户空间。

我也面临同样的问题,我读这个文件http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-6.html ,所以计划使用信号。 在我的情况下,没有信号丢失的机会,因为
1.系统是闭环的,信号执行后只有我会得到另一个信号。
2.我正在使用POSIX实时信号。