免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1449 | 回复: 0

[通信方式] 求助:关于netlink以及与内核进程通信相关 [复制链接]

论坛徽章:
0
发表于 2012-12-18 14:15 |显示全部楼层
本帖最后由 雨夜流星 于 2012-12-18 14:16 编辑

之前做了一个东西是在内核拦截一个系统调用进行处理,而是用netlink socket在用户态进行控制和策略编辑等操作。
策略和匹配都是在内核完成的。

目前有一个新的需求,需要把匹配这部分从内核挪出来(暂时不考虑效率相关问题,只谈实现),碰到几个问题,诸位
有什么好的建议,谢谢。

用netlink进行通信,内核拦截到一个系统调用后,将操作抛出到用户态,用户态返回一个结果给内核(有点类似于libipq),并且通知该进程
进行下一步操作,这时候,出问题了。

定义:我的内核模块:my.ko,建立了netlinksocket,命名为进程 my_pid
        拦截到的系统调用的进程是 hook_pid,

1、hook_pid可以通过socket将消息发给用户态,但是用户态通过socket返回的结果是给了my_pid,此时my_pid如何才能
通知hook_pid并将结果传递过去。

2、hook_pid如何在发送消息给用户态之后进行等待?

大概的框架如下,麻烦大牛给指点指点


  1. int   recv_hook(info)
  2. {     // 拦截到一个系统调用会进入到这里
  3.        send_info_to_user(info);

  4.       // 问题1、用户态返回的消息到了recv_from_user()函数,这里如何才能取到返回的信息
  5.       //           此时本函数属于拦截的用户进程hook_pid,但是recv_from_user()接受到的
  6.       //           返回信息却是属于进程my_pid

  7.       // 问题2、在发送消息给用户态之后,这里应该等待返回结果,如何让hook_pid在这里等待。
  8.       //           如果这里进行休眠,并让出cpu的话,不知道能不能行得通,具体一点的还请指点
  9. }


  10. static void recv_from_user(struct sock * sk, int length)
  11. {     // 这里处理从用户态接收到的消息
  12.        while ( (skb = skb_dequeue(&sock ->sk_receive_queue)) != NULL )
  13.         {
  14.              ........
  15.         }
  16. }

  17. init()
  18. {  //这里创建了socket
  19.     sock = netlink_kernel_create(NETLINK_MY_SOCK, 0, recv_from_user, THIS_MODULE);
  20. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP