- 论坛徽章:
- 0
|
本帖最后由 雨夜流星 于 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如何在发送消息给用户态之后进行等待?
大概的框架如下,麻烦大牛给指点指点
- int recv_hook(info)
- { // 拦截到一个系统调用会进入到这里
- send_info_to_user(info);
- // 问题1、用户态返回的消息到了recv_from_user()函数,这里如何才能取到返回的信息
- // 此时本函数属于拦截的用户进程hook_pid,但是recv_from_user()接受到的
- // 返回信息却是属于进程my_pid
- // 问题2、在发送消息给用户态之后,这里应该等待返回结果,如何让hook_pid在这里等待。
- // 如果这里进行休眠,并让出cpu的话,不知道能不能行得通,具体一点的还请指点
- }
- static void recv_from_user(struct sock * sk, int length)
- { // 这里处理从用户态接收到的消息
- while ( (skb = skb_dequeue(&sock ->sk_receive_queue)) != NULL )
- {
- ........
- }
- }
- init()
- { //这里创建了socket
- sock = netlink_kernel_create(NETLINK_MY_SOCK, 0, recv_from_user, THIS_MODULE);
- }
复制代码 |
|