基于内核模块的测试代码编写

发表于:2012-10-10 11:21

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  在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发送数据。

  4.6 其它方法

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

  5、总结

  本文主要解决了如何对内核态的函数接口进行测试,其中包括置入内核态代码以调用到内核API接口的方法,使测试程序从用户态进入内核态的方法,以及如何实现用户空间和内核空间的交互等。目前,已经基于上述方法实现了对压缩卡KAPI的直接测试,测试代码已经应用到压缩卡基本功能(压缩和解压)的测试,异常测试和压力测试。未来将会视需求实现或完善出更通用的,使用方式也更为灵活的内核态接口的测试工具。

  (全文完)

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号