Linux驱动 读写文件【转】
转自:http://blog.csdn.net/h_armony/article/details/7546624
在VFS的支持下,用户态进程读写任何类型的文件系统都可以使用read和write着两个系统调用,但是在linux内核中没有这样的系统调用我们如何操作文件呢?我们知道read和write在进入内核态之后,实际执行的是sys_read和sys_write,但是查看内核源代码,发现这些操作文件的函数都没有导出(使用EXPORT_SYMBOL导出),也就是说在内核模块中是不能使用的,那如何是好?
通过查看sys_open的源码我们发现,其主要使用了do_filp_open()函数,该函数在fs/namei.c中,而在改文件中,filp_open函数也是调用了do_filp_open函数,并且接口和sys_open函数极为相似,调用参数也和sys_open一样,并且使用EXPORT_SYMBOL导出了,所以我们猜想该函数可以打开文件,功能和open一样。使用同样的查找方法,我们找出了一组在内核中操作文件的函数,如下:
| 功能 | 函数原型 | 
| 打开文件 | struct file *filp_open(const char *filename, int flags, int mode) | 
| 读取文件 | ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) | 
| 写文件 | ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) | 
| 关闭文件 | int filp_close(struct file *filp, fl_owner_t id) | 
我们注意到在vfs_read和vfs_write函数中,其参数buf指向的用户空间的内存地址,如果我们直接使用内核空间的指针,则会返回-EFALUT。所以我们需要使用
set_fs()和get_fs()宏来改变内核对内存地址检查的处理方式,所以在内核空间对文件的读写流程为:
- mm_segment_t fs = get_fs();
 - set_fs(KERNEL_FS);
 - //vfs_write();
 - vfs_read();
 - set_fs(fs);
 
下面为一个在内核中对文件操作的例子:
- #include <linux/module.h>
 - #include <linux/init.h>
 - #include <linux/fs.h>
 - #include <linux/uaccess.h>
 - static char buf[] = "你好";
 - static char buf1[10];
 - int __init hello_init(void)
 - {
 - struct file *fp;
 - mm_segment_t fs;
 - loff_t pos;
 - printk("hello enter\n");
 - fp = filp_open("/home/niutao/kernel_file", O_RDWR | O_CREAT, 0644);
 - if (IS_ERR(fp)) {
 - printk("create file error\n");
 - return -1;
 - }
 - fs = get_fs();
 - set_fs(KERNEL_DS);
 - pos = 0;
 - vfs_write(fp, buf, sizeof(buf), &pos);
 - pos = 0;
 - vfs_read(fp, buf1, sizeof(buf), &pos);
 - printk("read: %s\n", buf1);
 - filp_close(fp, NULL);
 - set_fs(fs);
 - return 0;
 - }
 - void __exit hello_exit(void)
 - {
 - printk("hello exit\n");
 - }
 - module_init(hello_init);
 - module_exit(hello_exit);
 - MODULE_LICENSE("GPL");
 
Linux驱动 读写文件【转】的更多相关文章
- 【转】 Linux内核中读写文件数据的方法--不错
		
原文网址:http://blog.csdn.net/tommy_wxie/article/details/8193954 Linux内核中读写文件数据的方法 有时候需要在Linuxkernel--大 ...
 - 编写linux驱动所用到的头文件(转)
		
转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include < ...
 - 【转】在linux内核中读写文件 -- 不错
		
原文网址:http://blog.csdn.net/tommy_wxie/article/details/8194276 1. 序曲 在用户态,读写文件可以通过read和write这两个系统调用来完成 ...
 - Linux驱动开发常用头文件
		
头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下: 1.主目录 <a.out.h> ...
 - Linux一个简单的读写文件
		
(1)linux中的文件描述符fd的合法范围是或者一个正正数,不可能是一个负数. (2)open返回的fd程序必须记录好,以后向这个文件的所有操作都要靠这个fd去对应这个文件,最后关闭文件时也需要fd ...
 - Android 怎样在linux kernel 中读写文件
		
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
 - linux下c通过虚拟地址映射读写文件的代码
		
在代码过程中中,把开发过程中比较好的一些代码片段记录起来,如下的代码内容是关于 linux下c通过虚拟地址映射读写文件的代码,应该对小伙伴有些好处.#include<stdio.h>#in ...
 - LINUX文件格式化读写(文件指针,缓冲)
		
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
 - LINUX读写文件
		
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
 
随机推荐
- Spark实战练习02--处理分隔符
			
一.场景 devicestatus.txt 文件包含了来自于不同运营商的移动设备的数据,不同的数据格式,包括设备ID.当前状态.位置等等.注意,该文件中的记录具有不同的字段分隔符:一些使用逗号,一些使 ...
 - 学习bash——通配符与特殊符号
			
一.通配符 这是bash操作环境中一个非常有用的功能,这让我们使用bash处理数据就更方便了. 常用通配符如下: 符号 意义 * 代表0个到无穷多个任意字符 ? 代表一个任意字符 [] 代表一定有一个 ...
 - 【iOS开发】NSOperation简单介绍
			
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
 - javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
			
主要介绍了javascript获取和判断浏览器窗口.屏幕.网页的高度.宽度等 scrollHeight: 获取对象的滚动高度.scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端 ...
 - 【Python】- 如何使用Visual Studio 2013编写python?
			
安装Visual Studio 2013 1.VS2013下载安装略 安装python2.7 1.从官网下载python2.7,下载地址:https://www.python.org/getit/ ...
 - RxJS & Angular
			
RxJS & Angular https://www.learnrxjs.io/ https://rxjs-cn.github.io/learn-rxjs-operators/ https:/ ...
 - P2730 魔板 Magic Squares
			
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...
 - 【题解】JSOI2010满汉全席
			
~bzoj1823 第一次接触2-SAT——SAT,即适定性(Satisfiability)的缩写.像名称所说,即满足需求的可能性问题,而k-SAT即每个人有k种需求,已经证明k>2时是一个NP ...
 - [洛谷P2763]试题库问题
			
题目大意:有 $k$ 种类型和 $n$ 个题目,每个题目会适应部分类型,第$i$个类型需要$s_i$的题,一道题只能满足一种类型,现要求出满足所有类型的题目的方案 题解:看到匹配,想到网络流,源点向试 ...
 - 安徽师大附中%你赛day3T1 怜香惜玉 解题报告
			
怜香惜玉 题意: 已知 \(f(x)=\frac{2 \times \sum_{(i,x)=1}^x i}{φ(x)}\) 先给定数据组数\(t\)和\(k\) 每组数据给出\(n\),求\(\sum ...