linux/fs.h和asm/uaccess.h头文件中声明
1、 filp_open()在kernel中可以打开文件,其原形如下:
strcut file* filp_open(const char* filename, int open_mode, int mode);
该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。
参数说明
filename: 表明要打开或创建文件的名称(包括路径部分)。在内核中打开的文件时需要注意打开的时机,很容易出现需要打开文件的驱动很早就加载并打开文件,但需要打开的文件所在设备还不有挂载到文件系统中,而导致打开失败。
open_mode: 文件的打开方式,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。
mode: 创建文件时使用,设置创建文件的读写权限,其它情况可以匆略设为0
2、 读写文件
kernel中文件的读写操作可以使用vfs_read()和vfs_write,在使用这两个函数前需要说明一下get_fs()和 set_fs()这两个函数。
vfs_read() vfs_write()两函数的原形如下:
ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos);
ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos);
注意这两个函数的第二个参数buffer,前面都有__user修饰符,这就要求这两个buffer指针都应该指向用户空间的内存,如果对该参数传 递kernel空间的指针,这两个函数都会返回失败-EFAULT。但在Kernel中,我们一般不容易生成用户空间的指针,或者不方便独立使用用户空间 内存。要使这两个读写函数使用kernel空间的buffer指针也能正确工作,需要使用set_fs()函数或宏(set_fs()可能是宏定义),如 果为函数,其原形如下:
3、 关闭读写文件
int filp_close(struct file*filp, fl_owner_t id);
该函数的使用很简单,第二个参数一般传递NULL值,也有用current->files作为实参的
参考链接:https://blog.csdn.net/yf210yf/article/details/8997007
https://www.cnblogs.com/sky-heaven/p/5549357.html
4、
set_fs()和get_fs()用法:
fp =filp_open("/home/1.txt",O_RDWR | O_CREAT,0644);//创建用户空间文件,获取文件句柄。
if (IS_ERR(fp)){
printk("create file error\n");
return -1;
}
fs =get_fs();//获取当前线程的thread_info->addr_limit。
set_fs(KERNEL_DS);//将能访问的空间thread_info->addr_limit扩大到KERNEL_DS。
pos =0;
vfs_write(fp,buf, sizeof(buf), &pos);//调用vfs_write写内容
pos =0;
vfs_read(fp,buf1, sizeof(buf), &pos);//调用vfs_read读取内容
printk("Write contet=%s\n",buf1);
filp_close(fp,NULL);//关闭文件
set_fs(fs);//将thread_info->addr_limit切换回原来值
只有使用上面的方法,才能在内核中使用open,write等的系统调用。
其实这样做的主要原因是open,write的参数在用户空间,在这些系统调用的实现里需要对参数进行检查,就是检查它的参数指针地址是不是用户空间的。
系统调用本来是提供给用户空间的程序访问的,所以,对传递给它的参数(比如上面的buf、buf1),它默认会认为来自用户空间。
内核使用系统调用参数肯定是内核空间,为了不让这些系统调用检查参数所以必须设置set_fs(KERNEL_DS)才能使用该系统调用。
参考链接:https://www.cnblogs.com/arnoldlu/p/8879800.html
5、 opendir、readdir的使用
main()
{
DIR * dir;
struct dirent * ptr;
int i;
dir = opendir("/etc/rc.d");
while((ptr = readdir(dir)) != NULL)
{
printf("d_name : %s\n", ptr->d_name);
}
closedir(dir);
}
6、
#include <linux/syscalls.h>
sys_mkdir、sys_mount
https://blog.csdn.net/nanaoxue/article/details/35779665