在kernel space 可以通过下面两个函数从文件中读取数据,一个是以文件路径为参数,一个是以文件fd为参数
extern int kernel_read_file_from_path(char *, void **, loff_t *, loff_t, enum kernel_read_file_id);
extern int kernel_read_file_from_fd(int, void **, loff_t *, loff_t,enum kernel_read_file_id);
如果获得文件fd 可以通过filp_open()
filp_open()在kernel中可以打开文件,其原形如下:
strcut file* filp_open(const char* filename, int open_mode, int mode);
可以通过extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t);来在kernel space写数据到文件
对文件读写完成后调用 filp_close(filp, NULL);来关闭文件.
我们重点看看
int kernel_read_file_from_path(char *path, void **buf, loff_t *size,
loff_t max_size, enum kernel_read_file_id id)
{
struct file *file;
int ret;
if (!path || !*path)
return -EINVAL;
//打开这个文件
file = filp_open(path, O_RDONLY, 0);
if (IS_ERR(file))
return PTR_ERR(file);
//在kernel中读取这个文件
ret = kernel_read_file(file, buf, size, max_size, id);
fput(file);
return ret;
}
kernel_read_file->kernel_read
int kernel_read(struct file *file, loff_t offset,
char *addr, unsigned long count)
{
mm_segment_t old_fs;
loff_t pos = offset;
int result;
//这里需要注意的是在调用vfs的函数读写文件时必须调用set_fs()和get_fs()宏来改变内核对内存地址检查的处理方式.
old_fs = get_fs();
set_fs(get_ds());
/* The cast to a user pointer is valid due to the set_fs() */
//调用vfs的read接口来读取文件
result = vfs_read(file, (void __user *)addr, count, &pos);
set_fs(old_fs);
return result;
}
总结一下,kernel中可以直接通过kernel_read_file_from_path来读取某个路径的文件,通过kernel_write来写文件,通过filp_close来关闭这个文件。这三个函数都是vfs提供
接口的包装。
kernel space对文件的读写操作
最新推荐文章于 2024-03-18 18:29:49 发布