Chinaunix首页 | 论坛 | 博客
  • 博客访问: 524980
  • 博文数量: 122
  • 博客积分: 2024
  • 博客等级: 上尉
  • 技术积分: 1484
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 21:17
文章分类

全部博文(122)

文章存档

2012年(2)

2011年(25)

2010年(95)

分类: LINUX

2010-03-25 17:07:49

转自http://prolqspace.spaces.live.com/blog/cns!7240DE3B63F5B841!939.entry

文件:nltimer.rar
大小:58KB
下载:下载

最近做Netlink的实验,网上相关的教程也不少,有些写得还十分系统,不过我拿来一测试,居然没一个能编译。后来仔细一看才发现,还是内核版本的问题。经过一番折腾,终于弄好了,下面简要介绍一下经验。

我用的ubuntu 8.04,内核更新至2.6.24-23,而从2.6.24开始,linux内部对netlink的实现机制和调用接口进行了很大的调整,特别是函数netlink_kernel_create(),最新的参数有6个之多。而网上大多数的教程和例子程序都是针对2.6.12以前版本的内核,甚至2.4版来说的,因此连最基本的函数都无法成功编译,更不用说后面的了。

事实上,新版的Netlink简化了使用逻辑。当然我这里说的主要是内核空间编程上,对用户空间程序,netlink仍然像经典的socket程序那样简单易用。我没有去仔细研究其他细节的函数,其实其他变化影响不大,这里仅对最核心的,变化最重要的create函数介绍一下,以下是函数原型:

extern struct sock *netlink_kernel_create(struct net *net,
                          int unit,unsigned int groups,
                          void (*input)(struct sk_buff *skb),
                          struct mutex *cb_mutex,
                          struct module *module);

使用方法如下(nl_sk是一个sock指针):

nl_sk = netlink_kernel_create(&init_net, NETLINK_TEST, 0, nl_data_ready, NULL, THIS_MODULE);

第一个参数是最新引入的。具体是什么功能我未能弄清楚,但是我找到了使用它的方法:就是用&init_net。这个init_net结构体是在linux/net/core/net_namespace.c 中定义的,此外在linux/include/net/net_namespace.h中也有外部定义,直接作为参数使用即可。第二个是以前版本也有的参数,即netlink类型。系统定义了16个,可以在net/netlink.h中找到。为了不和系统已有定义冲突(可能有些都被占用了),我们这里自己定义了一个值:#define NETLINK_TEST 22。后面的参数中,nl_data_ready比较重要,它有点类似于以前的初始化接收函数,但现在我们不需要自己调用调度的方法,让内核进程阻塞以便等待消息到来了。只要声明一个nl_data_ready函数,这里将其地址赋给此参数,netlink内部会自动处理消息到来事件,一旦收到来自用户空间的匹配消息,将自动调用nl_data_ready函数进行处理。因此这实际上是一大简化。最后一个参数THIS_MODULE是module.h中定义的,表示当前模块。这也是最新引入的参数,应该是为了配合自动调用数据接收函数nl_data_ready而加入的,毕竟,netlink需要知道这个接受函数到底是位于那个模块之中的,否则它怎么调用呢,呵呵。

好了,其他的大家直接看代码吧。我写的这个示例程序的功能是一个用户空间程序nltimer_u和内核模块nltimer_k进行交互。先启动内核模块,在启动用户程序,后者会发送一条Hello消息给内核模块。nltimer_k收到后,启动定时器,开始每1秒发送一条消息给用户程序,用户收到后加一个echo:前缀,再回复给内核。循环规定时间后,发送EXIT消息,双方收到后结束操作,用户进程退出。内核模块则准备接受下一次数据到来。不过此后都不会再进入定时器循环,而是只接收第一条hello消息,然后就发送EXIT。这个功能几乎涵盖了内核定时器和内核模块编程,以及新版netlink的大多数常用技巧,大家不妨一试。

我的环境是:ubuntu 8.04,linux kernel 2.6.24-23。开发环境配置完整,GCC为4.2版。


阅读(2099) | 评论(0) | 转发(0) |
0

上一篇:一个简单的malloc实现

下一篇:procfs

给主人留下些什么吧!~~