kernel space对文件的读写操作

来源:互联网 发布:如何修改jenkins端口 编辑:程序博客网 时间:2024/05/08 15:06
在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_readint 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提供接口的包装。

原创粉丝点击