【百度分享】基于内核模块的测试代码编写(三)

fvceww 2010-11-11 02:17:40
加精
上篇回顾:
【百度分享】基于内核模块的测试代码编写(一)
【百度分享】基于内核模块的测试代码编写(二)

4.5 af_netlink

netlink是一种特殊的socket,用于用户态与内核态的双向通讯。在实现用户和内核交互的各种方式中,netlink的主要特点得意于它继承了 socket的一些基本特性,包括异步通讯,多播,双向性,不需要额外的文件。在用户态中,netlink的使用与标准的socket API相同,在内核态,则需要使用专门的API。下面介绍具体的使用方法:

在用户态中,首先通过要创建socket,其中指定domain必须为AF_NETLINK,协议为通常SOCK_RAW,协议类型为NETLINK_GENERIC或其它自定义类型

sd = socket(AF_NETLINK, SOCK_RAW,NETLINK_GENERIC);

然后通过bind绑定源端的地址,地址结构定义如下,其中nl_family为AF_NETLINK,nl_pad 目前无用填充0,nl_pid为进程id,若为0代表内核;nl_groups用于组播时的组号。

struct sockaddr_nl {  
sa_family_t    nl_family;  
unsigned short nl_pad;  
__u32         nl_pid;  
__u32          nl_groups;  
} saddr;

bind(sd, (struct sockaddr*)&saddr, sizeof(saddr));

通过sendmsg可以发送消息msg到指定的地址。

ret = sendmsg(sd, &msg, 0);

在msg的所有元素中,msg_name需要指向一个sockaddr_nl 结构的首地址,用来表示发送的目的端的地址,如果是发送到内核,其中的nl_pid字段置为0;msg_iov是要发送消息集合的向量,向量中的每一项代表一条消息。每一项指向数据的首部为一个nlmsghdr结构,其字段定义了该条消息长度,消息类型,序号,发送者进程id等;随后跟随的是消息的主体数据部分。 当要接收消息时,通过recvmsg可以获得类似的消息向量,从而获得数据及发送者等有关信息。

在内核态,通过netlink_kernel_create可以在内核中新建socket结构并注册接收到消息的回调函数input,其原型为:
struct sock * netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len));

当接收到消息时,回调函数input中的sk指针就指向了刚刚创建的socket在内核中的结构,通过对该结构的访问,可以获得要接收的数据。一种基本的input实现如下:
void input (struct sock *sk, int len) {
struct sk_buff *skb;  
struct nlmsghdr *nlh = NULL;  
u8 *data = NULL;  
while ((skb = skb_dequeue(&sk->receive_queue)) != NULL) {  
nlh = (struct nlmsghdr *)skb->data;  
data = NLMSG_DATA(nlh);  
}     
}

此外,sock_release是在内核中释放socket的方法;而通过netlink_unicast和netlink_broadcast可以在内核中令netlink socket发送数据,具体的方法可以参考 http://blog.chinaunix.net/u/19940/showart_144827.html

4.6 其它方法

以上所介绍的方法具有一个共同特点,它们不需要较高版本的内核支持,添加新的功能不需要重新编译内核或替代内核中的原有功能。当然,还有一些其它方法,可能会需要内核版本或重新编译内核等条件的支持,但同样能达到用户态和内核态交互这一目标,比如修改或添加新的系统调用,或利用sysfs,relayfs 等特殊的虚拟文件系统。这里不再一一介绍。

5 总结

本文主要解决了如何对内核态的函数接口进行测试,其中包括置入内核态代码以调用到内核API接口的方法,使测试程序从用户态进入内核态的方法,以及如何实现用户空间和内核空间的交互等。目前,已经基于上述方法实现了对压缩卡KAPI的直接测试,测试代码已经应用到压缩卡基本功能(压缩和解压)的测试,异常测试和压力测试。未来将会视需求实现或完善出更通用的,使用方式也更为灵活的内核态接口的测试工具。
...全文
847 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
eve2010 2010-12-29
  • 打赏
  • 举报
回复
谢分享~
DeepintoWebRTC 2010-12-29
  • 打赏
  • 举报
回复
不错啊
lpmxj 2010-12-27
  • 打赏
  • 举报
回复
不错的东东
sdcpzzg 2010-12-27
  • 打赏
  • 举报
回复
很经典。。写的非常好。。
yaoluo1210 2010-12-27
  • 打赏
  • 举报
回复
谢谢楼主分享
a_364292964 2010-12-26
  • 打赏
  • 举报
回复
进来学习. .很好./ .
冲冲 2010-12-26
  • 打赏
  • 举报
回复
很 好
「已注销」 2010-12-26
  • 打赏
  • 举报
回复
wyc218 2010-12-25
  • 打赏
  • 举报
回复
看过的
macklau 2010-12-25
  • 打赏
  • 举报
回复
learnning....
adadddae 2010-12-25
  • 打赏
  • 举报
回复
很经典。。写的非常不多。。
q107770540 2010-12-25
  • 打赏
  • 举报
回复
奔标题而来
xuzysun 2010-12-24
  • 打赏
  • 举报
回复
看看!!!
xiaobaitu8629 2010-12-24
  • 打赏
  • 举报
回复
怎么这么多百度的东西啊?难道LZ跟百度有关系》?
wibnmo 2010-11-11
  • 打赏
  • 举报
回复
总是很精典。。
leafsoar 2010-11-11
  • 打赏
  • 举报
回复
Mark》。。
顶起来

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧