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

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

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

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

分享:

  4.4 Proc文件系统

  proc文件系统,是当前内核或内核模块,和用户交互的主要方式,它通过将虚拟的文件系统挂载在/proc下,利用虚拟文件读写在用户和内核态间传递信息。通过内核模块,可以向/proc下注册新的文件,指定用户读写该文件时的回调函数;这样,当用户读写该文件时,工作在内核态的回调函数就可以执行信息交互的有关工作。

  向内核中注册/proc下文件的调用是create_proc_entry,创建中需要指定文件名,访问权限和父节点名,返回为指向 proc_dir_entry结构的指针。通过该返回指针,可以进一步修改文件的用户id,组id,绑定的内核数据等;但最为关键的是可以指定用户读或写该文件时,在内核中被执行的回调函数。下面是一个向proc文件系统中注册新文件的示例:

static int __init proc_module_init(void){
entry = create_proc_entry(“astring”, 0644, myprocroot);
if (entry) {
entry->data = &string_var;
entry->read_proc = &string_read_proc;
entry->write_proc = &string_write_proc;
}
return 0
}
static void __exit procfs_exam_exit(void){
remove_proc_entry(“astring”, myprocroot);
remove_proc_entry(“myproctest”, NULL);
}
//read proc
int string_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data){
count = sprintf(page, “%s”, (char *)data);
return count;
}
//write proc
int string_write_proc(struct file *file, const char __user *buffer,
unsigned long count, void *data){
if (count > STR_MAX_SIZE) {
count = 255;
}
copy_from_user(data, buffer, count);
return count;
}

  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);

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号