Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3547644
  • 博文数量: 1805
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 20:01
文章分类

全部博文(1805)

文章存档

2017年(19)

2016年(80)

2015年(341)

2014年(438)

2013年(349)

2012年(332)

2011年(248)

分类: LINUX

2015-03-15 21:07:58

原文地址:内核空间中读写文件 作者: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);
可以
保证正确地将内核缓冲区的内容写到文件中去。

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