Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105710
  • 博文数量: 29
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 47
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-13 16:46
文章分类
文章存档

2014年(20)

2013年(4)

2012年(5)

我的朋友

分类: LINUX

2014-07-14 09:03:46

原文地址:内核空间中读写文件 作者:ebiyuan

接了一个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);
可以
保证正确地将内核缓冲区的内容写到文件中去。

阅读(1154) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~