Linux系统成功的关键因素之一就是具有与其他操作系统和谐共存的能力。Linux系统的文件系统由两层结构构建:第一层是虚拟文件系统(VFS),第二层是各种不同的具体的文件系统。 
VFS就是把各种具体的文件系统的公共部分抽取出来,形成一个抽象层,是系统内核的一部分,它位于用户程序和具体的文件系统之间。它对用户提供了标准的文件系统调用接口,对具体的文件系统(如EXT2、FAT32等),它通过一系列的对不同文件系统公用的函数指针来实际调用具体的文件系统函数,完成实际的各有差异的操作。任何使用文件系统的程序必须经过这层接口来使用它。通过这样的方式,VFS就对用户屏蔽了底层文件系统的实现细节和差异。 
在VFS的支持下,用户态进程读写任何类型的文件系统都可以使用read和write着两个系统调用,但是在linux内核中没有这样的系统调用我们如何操作文件呢?我们知道read和write在进入内核态之后,实际执行的是sys_read和sys_write,但是查看内核源代码,发现这些操作文件的函数都没有导出(使用EXPORT_SYMBOL导出),也就是说在内核模块中是不能使用的.通过查看sys_open的源码我们发现,其主要使用了do_filp_open()函数,该函数在fs/namei.c中,而在改文件中,filp_open函数也是调用了do_filp_open函数,并且接口和sys_open函数极为相似,调用参数也和sys_open一样,并且使用EXPORT_SYMBOL导出了,所以我们猜想该函数可以打开文件,功能和open一样。使用同样的查找方法,我们找出了一组在内核中操作文件的函数,如下:

我们注意到在vfs_read和vfs_write函数中,其参数buf指向的用户空间的内存地址,如果我们直接使用内核空间的指针,则会返回-EFALUT。所以我们需要使用set_fs()和get_fs()宏来改变内核对内存地址检查的处理方式。 
另外,使用vfs_read()和vfs_write()需要注意的一点是最后的参数loff_t *pos,pos所指向的值要初始化,表明从文件的什么地方开始读写。例如,可以使用 loff_t pos = fp->f_pos; 
实例代码:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/dcache.h>
#include <linux/fs.h> #include <linux/err.h> #include <linux/string.h> #include <linux/errno.h> #include <asm/fcntl.h> #include <asm/processor.h> #include <asm/uaccess.h> int __init hello_init(void) { unsigned char buf1[12]="hello world."; unsigned char buf2[12]="kernel file."; struct file *fp; mm_segment_t fs; loff_t pos; printk("hello enter\n"); fp = filp_open("/home/kernel_file", O_RDWR | O_CREAT, 0644); if (IS_ERR(fp)) { printk("create file error\n"); return -1; } fs = get_fs(); set_fs(KERNEL_DS); pos = fp->f_pos; vfs_write(fp, buf1, sizeof(buf1), &pos); fp->f_pos = pos; pos = fp->f_pos; vfs_write(fp, buf2, sizeof(buf2), &pos); fp->f_pos = pos; set_fs(fs); filp_close(fp, NULL); return 0; } void __exit hello_exit(void) { printk("hello exit\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); 

(转载自 网络 原创不详)

转载于:https://www.cnblogs.com/Liangzilv/p/10224851.html

filp_open/filp_close/vfs_read/vfs_write相关推荐

  1. Linux内核中读写文件数据的方法

    Linux内核中读写文件数据的方法     有时候需要在Linuxkernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数, ...

  2. 【转】 Linux内核中读写文件数据的方法--不错

    原文网址:http://blog.csdn.net/tommy_wxie/article/details/8193954 Linux内核中读写文件数据的方法     有时候需要在Linuxkernel ...

  3. linux内核中打开文件 及属性控制

    共两篇文章:还可以参考linux那些事linx_sysfs ====================================================================== ...

  4. 科软-信息安全实验3-Rootkit劫持系统调用

    目录 一 前言 二 Talk is cheap, show me the code 三 前期准备 四 效果演示 五 遇到的问题&解决 六 18.04的坑 七 参考资料 八 老师可能的提问 一 ...

  5. 内核态文件操作【转】

    转自:http://blog.csdn.net/yf210yf/article/details/8997007 有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在 ...

  6. linux 内核驱动中对文件的读写

    转载地址 http://www.360doc.com/content/12/1224/10/3478092_255969804.shtml 有时候需要在Linux kernel--大多是在需要调试的驱 ...

  7. linux内核驱动中对文件的读写 【转】

    本文转载自:http://blog.chinaunix.net/uid-13059007-id-5766941.html 有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文 ...

  8. Linux内核文件操作

    Linux内核文件操作 前言 一.文件操作结构体 二.VFS之file_operations对象 1.文件打开filp_open 2.文件关闭filp_close 3.文件读取vfs_read 4.文 ...

  9. KVM虚拟机IO处理过程(一) ----Guest VM I/O 处理过程

    虚拟化技术主要包含三部分内容:CPU虚拟化,内存虚拟化,设备虚拟化.本系列文章主要描述磁盘设备的虚拟化过程,包含了一个读操作的I/O请求如何从Guest Vm到其最终被处理的整个过程.本系列文章中引用 ...

  10. 手机IO workload解析

    背景 工作中常有些这样需求,需要分析zip解压缩,androbench和应用安装等存储应用场景在不同版本,不同平台的性能差异,并且需要对这些场景做性能优化. 想要做好这些需求工作,首先得对这些场景下的 ...

最新文章

  1. 2018技术卓越奖发布 阿里云数据库POLARDB获最佳创新产品奖
  2. python PyQt5 sizeHint()
  3. 微软自家的.Net下的JavaScript引擎——ClearScript
  4. python匹配字符串_字符串匹配算法之Kmp算法(Python实现)
  5. clion导入mysql库_CLion如何添加依赖库 ? 需要把mysql/Connector c++放入 用cpp连接数据库...
  6. JDK8帮助文档生成-笔记
  7. qq linux五笔输入法下载官网,【qq五笔官方下载】qq五笔输入法官方下载电脑版 最新版-开心电玩...
  8. 5G NR Type II CSI Codebook简介
  9. 嵌入式技术学习路线摘要
  10. ABP框架Web API跨域问题的解决方案
  11. php网页加入音乐和歌词,怎么给视频加歌词,给mv加歌词,视频加歌词字幕
  12. nodeJS xlsx库 笔记
  13. 网卡5790c linux驱动,Linux内核配置(12)
  14. 【前沿招聘】美的集团高薪招聘SRM运维工程师/实施顾问
  15. 单片机毕业设计题目选题推荐
  16. 字魂字体包全网站VIPps古风毛笔书法cdr广告海报设计素材字库下载
  17. 北大青鸟帮助你实现IT人梦想
  18. Android4.1.1,USB存储模式
  19. dede模板标签帮助[DedeCMS教程]
  20. 七月在线机器学习中的数学第二期笔记1

热门文章

  1. OpenCV物体颜色检测(Python)
  2. 百度地图API V2.0 离线版本
  3. hyper-v开启与关闭
  4. Calendar日期类使用总结
  5. 不规则图片显示(css实现多边形)
  6. MapWinGIS4.9.3的二次开发
  7. 如何从零开始成为一名优秀的程序员?---转载、翻译自Quora
  8. html文本显示不完整,css 内容显示不全怎么办
  9. 怎么使用计算机公式,如何在电脑上输入运算公式?
  10. ConcurrentHashMap的锁