免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6461 | 回复: 15
打印 上一主题 下一主题

[通信方式] 用户态与内核态通信,中断上下文中使用netlink,如何做到同步? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-20 15:19 |只看该作者 |倒序浏览
本帖最后由 dreamzen 于 2015-01-20 16:50 编辑

有个问题需要请教一下各位大神:
      内核中处于中断上下文环境,我需要将数据传到用户态进行处理,处理完再传给内核使用,但是整个过程需要是串行的,也就是内核将数据发给用户态后需要等待用户态传回数据,然后再使用。
      我查了资料发现用户态和内核态通信有很多方式,但是在中断上下文环境下,netlink是适用的。但是netlink是异步的,内核只能被动的接收用户态传回的数据,我尝试用while循环检测数据是否传回(很傻,只是为了测试netlink是否可用),发现貌似可以工作,但极其不稳定。
      不知道有没有方法适用于我这种情况?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2015-01-20 20:02 |只看该作者
方法很多呀。除了netlink外,proc接口,设备文件接口都可以进行内核和应用的数据传送呀。

至于你要串行的问题,那应通过一定的锁或信号量就能保证呀。

论坛徽章:
0
3 [报告]
发表于 2015-01-20 20:26 |只看该作者
谢谢!
因为是在中断上下文环境,所以有很多限制(上次我问的内核态使用direct io也是你给的解答,非常感谢!不过在中断上下文没有派上用场,因为中断上下文是不允许打开文件、kmalloc等操作的,任何可能引起休眠的函数都不能使用,copy_from_user()等等),因为netlink可以在中断上下文使用,所以就尝试了一下。我也看到了proc方法,但是不确定能否在中断上下文使用,所以还没有尝试。另外锁和信号量好像也不能使用……

Tinnal 发表于 2015-01-20 20:02
方法很多呀。除了netlink外,proc接口,设备文件接口都可以进行内核和应用的数据传送呀。

至于你要串行的 ...

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
4 [报告]
发表于 2015-01-20 21:17 |只看该作者
回复 3# dreamzen


  1. 在中断里当然不能用信号量,但可以用spinlock。
2. 在中断里当然不能使用copy_to_user, 但可以准备好数据,然后**柱塞在内核态的proc(或驱动接口)内核代码,然后再把数据向用户态推送。等待队列就是其中一种方案。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2015-01-21 09:01 |只看该作者
这样的操作放在中断上下文中进行,本身就很危险。
建议考虑下方案的合理性。。

论坛徽章:
0
6 [报告]
发表于 2015-01-21 13:17 |只看该作者
谢谢!我调研一下~

回复 4# Tinnal


   

论坛徽章:
0
7 [报告]
发表于 2015-01-21 13:21 |只看该作者
我要做的是将每个发出的数据包处理一下,再将每个收到的数据包做相应处理。数据包的接收过程是在中断上下文,所以就这样了……不知道对于这样的需求,有没有更好的方案?谢谢!
回复 5# humjb_1983


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
8 [报告]
发表于 2015-01-21 15:51 |只看该作者
dreamzen 发表于 2015-01-21 13:21
我要做的是将每个发出的数据包处理一下,再将每个收到的数据包做相应处理。数据包的接收过程是在中断上下文 ...

没有必要到用户态绕一圈吧,直接在内核态不行?

论坛徽章:
0
9 [报告]
发表于 2015-01-21 17:06 |只看该作者
humjb_1983 发表于 2015-01-21 15:51
没有必要到用户态绕一圈吧,直接在内核态不行?


最开始尝试过在内核态做,具体要做的事情是:打开文件,写入数据(会自动加密),再从文件读出数据。因为需要使用direct io绕过内核cache,所以需要在内核态申请用户态空间再使用DIRECT_IO才可以。但是在中断上下文不允许访问用户态空间,也不能打开文件等等。。所以前功尽弃,只能通过用户态做加密了。。
还有,机器是单核的,用自旋锁的spin_unlock_wait()直接就无响应了。。
另外,不知道netfilter能不能满足我的需求呢?望大神可以指点一二。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
10 [报告]
发表于 2015-01-21 17:11 |只看该作者
dreamzen 发表于 2015-01-21 17:06
最开始尝试过在内核态做,具体要做的事情是:打开文件,写入数据(会自动加密),再从文件读出数据。因 ...

加密一定要通过“文件”的方式么?看起来有点怪,呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP