用户态与内核态通信,中断上下文中使用netlink,如何做到同步?
本帖最后由 dreamzen 于 2015-01-20 16:50 编辑有个问题需要请教一下各位大神:
内核中处于中断上下文环境,我需要将数据传到用户态进行处理,处理完再传给内核使用,但是整个过程需要是串行的,也就是内核将数据发给用户态后需要等待用户态传回数据,然后再使用。
我查了资料发现用户态和内核态通信有很多方式,但是在中断上下文环境下,netlink是适用的。但是netlink是异步的,内核只能被动的接收用户态传回的数据,我尝试用while循环检测数据是否传回(很傻,只是为了测试netlink是否可用),发现貌似可以工作,但极其不稳定。
不知道有没有方法适用于我这种情况? 方法很多呀。除了netlink外,proc接口,设备文件接口都可以进行内核和应用的数据传送呀。
至于你要串行的问题,那应通过一定的锁或信号量就能保证呀。
谢谢!
因为是在中断上下文环境,所以有很多限制(上次我问的内核态使用direct io也是你给的解答,非常感谢!不过在中断上下文没有派上用场,因为中断上下文是不允许打开文件、kmalloc等操作的,任何可能引起休眠的函数都不能使用,copy_from_user()等等),因为netlink可以在中断上下文使用,所以就尝试了一下。我也看到了proc方法,但是不确定能否在中断上下文使用,所以还没有尝试。另外锁和信号量好像也不能使用……
Tinnal 发表于 2015-01-20 20:02 static/image/common/back.gif
方法很多呀。除了netlink外,proc接口,设备文件接口都可以进行内核和应用的数据传送呀。
至于你要串行的 ... 回复 3# dreamzen
1. 在中断里当然不能用信号量,但可以用spinlock。
2. 在中断里当然不能使用copy_to_user, 但可以准备好数据,然后**柱塞在内核态的proc(或驱动接口)内核代码,然后再把数据向用户态推送。等待队列就是其中一种方案。 这样的操作放在中断上下文中进行,本身就很危险。
建议考虑下方案的合理性。。 谢谢!我调研一下~
回复 4# Tinnal
我要做的是将每个发出的数据包处理一下,再将每个收到的数据包做相应处理。数据包的接收过程是在中断上下文,所以就这样了……不知道对于这样的需求,有没有更好的方案?谢谢!
回复 5# humjb_1983
dreamzen 发表于 2015-01-21 13:21 static/image/common/back.gif
我要做的是将每个发出的数据包处理一下,再将每个收到的数据包做相应处理。数据包的接收过程是在中断上下文 ...
没有必要到用户态绕一圈吧,直接在内核态不行? humjb_1983 发表于 2015-01-21 15:51 static/image/common/back.gif
没有必要到用户态绕一圈吧,直接在内核态不行?
最开始尝试过在内核态做,具体要做的事情是:打开文件,写入数据(会自动加密),再从文件读出数据。因为需要使用direct io绕过内核cache,所以需要在内核态申请用户态空间再使用DIRECT_IO才可以。但是在中断上下文不允许访问用户态空间,也不能打开文件等等。。所以前功尽弃,只能通过用户态做加密了。。
还有,机器是单核的,用自旋锁的spin_unlock_wait()直接就无响应了。。
另外,不知道netfilter能不能满足我的需求呢?望大神可以指点一二。 dreamzen 发表于 2015-01-21 17:06 static/image/common/back.gif
最开始尝试过在内核态做,具体要做的事情是:打开文件,写入数据(会自动加密),再从文件读出数据。因 ...
加密一定要通过“文件”的方式么?看起来有点怪,呵呵。
页:
[1]
2