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");

linux内核态文件操作filp_open/filp_close/vfs_read/vfs_write相关推荐

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

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

  2. linux 内核 目录文件说明

    本文使用的源代码是Linux kernel 3.9.4. 下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4. ...

  3. LINUX内核目录文件说明

    内核空间和用户空间 在下载内核前,我们应该讨论一些重要的术语和事实.首先了解一下内核空间和用户空间 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据.不管是内核空间还是 ...

  4. linux内核快速倒车,初探Linux内核态——通过proc文件系统作快速问题定位

    这篇博客的内容完全是关于现代Linux内核的.换句话说,指的是与RHEL6一样使用的2.6.3x系列内核,而不是古老的RHEL5所使用的2.6.18内核(都什么鬼了?!),虽然大部分企业都还在使用RH ...

  5. 通过/proc查看Linux内核态调用栈来定位问题

    文章目录 1.定位一个"运行慢"的进程 2.strace -cp 27288 3. pstack 27288 3.进程状态和WCHAN字段 4.进程有什么活动或者完全挂死了? 5. ...

  6. Linux 内核的文件 Cache 管理机制介绍

    1 前言 自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,使用得非常广泛,它与 Windows.UNIX 一起占据了操作系统领域几乎所有的市场份额.特别是在高性能计算 ...

  7. Linux内核态抢占机制分析

    http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html [摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核( ...

  8. Linux内核态之间进程通信,Linux 系统内核空间与用户空间通信的实现与分析[转载]...

    [https://www.ibm.com/developerworks/cn/linux/l-netlink/index.html] 多数的 Linux 内核态程序都需要和用户空间的进程交换数据,但 ...

  9. Linux内核Makefile文件

    Linux内核Makefile文件(翻译自内 核手册) 转载自:http://blog.chinaunix.net/uid-21651676-id-60377.html Linux 内核Makefil ...

  10. linux的头文件下载,Linux内核头文件(linux headers)

    更新 Linux 内核头文件(linux headers) 三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文 ...

最新文章

  1. python 数据库表结构转为类_Python数据科学实践 | 数据库1
  2. 《设计师要懂心理学》-第五章-人如何集中注意力
  3. spring boot使用外置tomcat部署需要排除的依赖
  4. primefaces_使用Bean验证扩展PrimeFaces CSV
  5. php 内部异步执行顺序,event_loop中不同异步操作的执行顺序
  6. 现在补上个人项目的分析照片
  7. 手写数字识别项目代码——卷积神经网络LeNet-5模型
  8. 【转载】手动删除引用nuget如何还原
  9. 黑苹果论坛被封_给掌上电脑装上黑苹果,买到的人都觉得赚大了
  10. Visual Studio 2008创建项目(ATL)
  11. 专利与论文-4:专利申请流程与生命周期及费用
  12. excel转换linux时间戳,在Excel中转换时间戳(timeStamp)
  13. Windows 软件管理
  14. 100M宽带能下载多快? 关于带宽的下载速度研究
  15. 使用Blinker APP+NodeMCU控制多路接口
  16. php制作公司五章,圆形印章和椭圆形印章,正方形印章,圆角正方形印章,圆角框
  17. 2D 横向对抗射击游戏之美
  18. 计算机引起usb设备无法识别的原因有哪些,计算机无法识别USB设备是什么原因
  19. Python爬取安居客新房信息
  20. 11月03日 星期四

热门文章

  1. 断舍离---新生活方式指引
  2. yigo基础学习笔记1
  3. 多多情报通:拼多多推广账户金额可以通用吗?里面钱可以提出来吗?
  4. [py] 统计输入字符串中的单词个数及单词的平均长度
  5. 流浪是对另一种生活的执着
  6. C++的学习路线以及未来就业趋势
  7. org.apache.felix.http.jetty %bundles.pluginTitle: Cannot start (org.osgi.framework.BundleException:
  8. 数字方法--按零补位
  9. codelite开发php,C++跨平台开发环境(CodeLite)
  10. AES简介加密算法介绍