linux内核中读写文件数据的方式有时侯须要在Linuxkernel--大多是在须要调试的驱动程序--中读写文件数据。kernel中操作文件没有标准库可用,须要借助kernel的一些函数,这种函数主要有:filp_open(filp_close(,vfs_read(vfs_write(,set_fs(,get_fs(等,这种函数在linux/fs.h打开文件filp_open(在kernel中可以打开文件,其原形如下:strcutfile*filp_open(constchar*filename,intopen_mode,intmode;该函数返回strcutfile*结构表针,供后继函数操作使用,该返回值用验其有效性。参数说明filename:表明要打开或创建文件的名称(包括路径部份。在内核中打开的文件要注意打开的时机,很容易出现须要打开文件的驱动很早就加载并打开文件,但须要打开的文件所在设备还不有挂载到文件系统中,而造成打开失败。open_mode:文件的打开方法红旗linux,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。mode:创建文件时使用,设置创建文件的读写权限,其它情况可以匆略设为读写文件kernel中文件的读写操作可以使用vfs_read(和vfs_write,在使用这两个函数前须要说明一下get_fs(和set_fs(这两个函数。
vfs_read(vfs_write(两函数的原形如下:ssize_tvfs_read(structfile*filp,char__user*buffer,size_tlen,loff_t*pos;ssize_tvfs_write(structfile*filp,constchar__user*buffer,size_tlenlinux内核文件读写浅析 hi.baidu,loff_t*pos;注意这两个函数的第二个参数buffer,上面都有__user修饰符,这就要求这两个buffer表针都应当指向用空的显存,假如对该参数传递kernel空间的表针,这两个函数就会返回失-EFAULT。但在Kernel中,我们通常不容易生成用户空间的表针linux内核文件读写浅析 hi.baidu,或则不便捷独立使用用户空间显存。要使这两个读写函数使用kernel空间的buffer表针也能正确工作,须要使用set_fs(函数或宏(set_fs(可能是宏定义,倘若为函数,其原形如下:voidset_fs(mm_segment_tfs;该函数的作用是改变kernel对显存地址检测的处理方法,虽然该函数的参数fs只有两个取值:USER_DSKERNEL_DS,分别代表用户空间和内核空间,默认情况USER_DS,即对用户空间地址检测并做变换。
这么要在这些对显存地址做检测变换的函数中使用内核空间地址,就须要使用set_fs(KERNEL_DS行设置。get_fs(通常也可能是宏定义,它的作用是取得当前的设置,这两个函数的通常用法为:mm_segment_told_fs;old_fsget_fs(;set_fs(KERNEL_DS;//与显存有关的操作set_fs(old_fs;还有一些其它的内核函数也有用__user修饰的参数,kernel中须要用kernel空间的显存取代时linux 输入法,都可以使用类似办法。使用vfs_read(和vfs_write(最后须要注意的一点是最后的参数loff_tpos,pos所指向的值要初始化,表明从文件的哪些地方开始读写。关掉读写文件intfilp_close(structfile*filp,fl_owner_tid;该函数的使用很简单,第二个参数通常传递NULL也有用current->files为左值的。使用以上函数的其它注意点:虽然LinuxKernel组成员不赞同在kernel中独立的读写文件(这样做可能会影响到策略和安全问题,对内核须要的文件内容,最好由应用层配合完成。在可加载的kernelmodule中使用这些方法读写文件可能使模块加载失败,原核可能没有EXPORT你所须要的所有这种函数。此,有些函数不能在中断的handleKernel中不属于任可进程的代码中执行,否则可能出现崩溃,要防止此类情况发生,可以在kernel中创建内核线程,将这种函数放到线程环境下执行(创建内核线程的方法请参数kernel_thread(函数