接了一个Linux内核编程的任务,编写一个内核模块,动态加载,加载时读入一个配置文件的内容。以前没有做过内核编程,接到这个任务,先是榙环境,摸索了怎么编写一个内核模块的框架。成功后,发现Linux编写内核模块的基本过程是如此的简单。
开始着手研究怎么样打开文件,发现内核中可以使用sys_open系统调用来打开文件,也可以直接使用filp_open函数,前者返回一个文件句柄,后者返回一个struct file*型的指针。不过刚开始不清楚,使用:
fd = sys_open(path, O_RDONLY, 0);
打开文件却不能成功。而:
filp = filp_open(path, O_RDONLY, 0);
却能成功。
但使用filp->f_op->read(filp, buf, size, &filp->f_pos);
读文件却不能将内容读到buf中去。
后面分析sys_open的原型为:
asmlinkage long sys_open(const char __user * filename, int flags, int mode);
在filename前面有个__user的修饰符,这里似乎说明了这个filename是来自用户空间,进而查看struct file中f_op对应用类型struct file_operation结构体对read指向的函数原型的定义中,buf参数也是用__user修饰的,也就是说,它只能向用户空间传递。
在网上一搜,有人使用set_fs(get_ds())来设置进程寻址界限,使其可以对内核空间进行寻址,从而可以读写内核缓冲区。
如代码:
old_fs = get_fs();
set_fs(KERNEL_DS);
file->f_op->write(file, (char *)buf, sizeof(buf), &file->f_pos);
set_fs(old_fs);
可以保证正确地将内核缓冲区的内容写到文件中去。
阅读(1705) | 评论(0) | 转发(0) |