Sha*_*baz 21 c semaphore linux-kernel
是否可以在用户空间和内核空间之间共享信号量(或任何其他同步锁)?命名的POSIX信号量具有内核持久性,这就是为什么我想知道是否有可能从内核上下文创建和/或访问它们.
由于有关正常使用POSIX信号量的大量信息,搜索互联网并没有多大帮助.
我正在为实时系统开发一个统一的界面,我在其中添加了一些书籍,由信号量保护.这些书籍保留是在资源分配和解除分配上完成的,这是在非实时环境中完成的.
使用RTAI,等待和发布信号量的线程需要处于实时上下文中.这意味着使用RTAI的命名信号量意味着在用户空间中的每个等待/发布之间切换实时和非实时上下文,更糟糕的是,为内核空间中的每个sem/wait创建一个短实时线程.
我正在寻找的是一种在内核和用户空间之间共享正常Linux或POSIX信号量的方法,这样我就可以安全地在非实时环境中等待/发布它.
任何有关此主题的信息将不胜感激.如果这是不可能的,你还有其他任何想法如何完成这项任务?1
1一种方法是添加系统调用,在内核空间中具有信号量,并让用户空间进程调用该系统调用,并且信号量将全部在内核空间中进行管理.如果我不是因为这个而不必修补内核,我会更高兴.
gby*_*gby 14
那么,你是在正确的方向,但不是 -
名为POSIX信号量的Linux基于FUTex,它代表快速用户空间互斥.顾名思义,虽然它们的实现由内核辅助,但其中很大一部分是由用户代码完成的.在内核和用户空间之间共享这样的信号量需要在内核中重新实现此基础结构.可能,但肯定不容易.
另一方面,SysV信号量完全在内核中实现,只能通过标准系统调用(例如sem_timedwait()和朋友)访问用户空间.
这意味着每个与SysV相关的操作(信号量创建,获取或释放)实际上都是在内核中实现的,您只需从代码中调用底层内核函数即可从内核中获取相同的信号量.
因此,您的用户代码将只是调用sem_timedwait().这很容易.
内核部分有点棘手:你必须找到sem_timedwait()在内核中实现和相关调用的代码(它们都在文件ipc/sem.c中)并创建每个函数的副本一下原来的功能确实没有来电copy_from_user(...)和copy_to_user(..)和朋友.
原因是那些内核函数期望从带有指向用户缓冲区的指针的系统调用中调用,而你想用内核缓冲区中的参数调用它们.
举个例子sem_timedwait()- 相关的内核函数sys_timedwait()在ipc/sem.c中(参见http://lxr.free-electrons.com/source/ipc/sem.c#L1537).如果您在内核代码复制此功能,只是删除该做的部分copy_from_user(),并copy_to_user()与简单地使用通过指针(因为你会从内核空间叫他们),你会得到内核,可以采取的SysV信号灯从内核空间同等功能,沿着用户空间 - 只要你从内核中的用户上下文中调用它们(如果你不知道最后一句话是什么意思,我强烈建议你阅读Linux设备驱动程序,第3版).
祝你好运.
我能想到的一个解决方案是在主内核模块上有一个/proc(或者/sys其他)文件,其中写入0/ 写入1(或从中读取/写入)将导致它发出一个up/ downon a semaphore.导出该信号量允许其他内核模块在用户应用程序通过/proc文件系统时直接访问它.
我还在等着看原问题是否有答案.
| 归档时间: |
|
| 查看次数: |
7217 次 |
| 最近记录: |