1. 打开文档
strcut file* filp_open(const char* filename, int open_mode, int mode);
参数说明:
filename: 表明要打开或创建文件的名称(包括路径部分)。在内核中打开的文件时需要注意打开的时机,很容易出现需要打开文件的驱动很早就加载并打开文件,但需要打开的文件所在设备还不有挂载到文件系统中,而导致打开失败。
open_mode: 文件的打开方式,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。
mode: 创建文件时使用,设置创建文件的读写权限,其它情况可以匆略设为0
返回值: strcut file*结构指针
2. 读文件
ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos);
参数说明:
filp: strcut file*结构指针,指向文件
buffer: 存放读取内容的指针
len: 读取的长度
pos: 读取的位置,pos所指向的值要初始化,表明从文件的什么地方开始读写。
注意: buffer前面有__user修饰符,这就要求这个buffer指针应该指向用户空间的内存,如果对该参数传递kernel空间的指针,这两个函数都会返回失败-EFAULT。但在kernel中我们创建的内存一般都是kernel空间的。要使这个读函数使用kernel空间的buffer指针也能正确工作,需要使用set_fs()函数或宏(set_fs()可能是宏定义),如果为函数,其原形如下:void set_fs(mm_segment_t fs); 该函数的作用是改变kernel对内存地址检查的处理方式,其实该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表 用户空间和内核空间,默认情况下,kernel取值为USER_DS,即对用户空间地址检查并做变换。那么要在这种对内存地址做检查变换的函数中使用内核 空间地址,就需要使用set_fs(KERNEL_DS)进行设置。get_fs()一般也可能是宏定义,它的作用是取得当前的设置,这两个函数的一般用 法为:
mm_segment_t old_fs;
old_fs = get_fs(); // 获取当前的地址检查方法
set_fs(KERNEL_DS); // 将地址检查方法设置为内核空间
vfs_read(); // 此时即可使用内核空间读取文件内容
set_fs(old_fs); // 将之前非地址检查方法设置回去
所有用kernel中地址替换user修饰的变量时都可使用此方法。
3. 写文件
ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos);
和read类似,注意buffer的user空间和pos需要初始化。
4. 关闭文件
int filp_close(struct file*filp, fl_owner_t id);
参数说明:
filp: strcut file*结构指针,指向文件
id: 一般传递NULL值即可。