linux内核态文件操作filp_open/filp_close/vfs_read/vfs_write
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相关推荐
- 内核态文件操作【转】
转自:http://blog.csdn.net/yf210yf/article/details/8997007 有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在 ...
- linux 内核 目录文件说明
本文使用的源代码是Linux kernel 3.9.4. 下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4. ...
- LINUX内核目录文件说明
内核空间和用户空间 在下载内核前,我们应该讨论一些重要的术语和事实.首先了解一下内核空间和用户空间 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据.不管是内核空间还是 ...
- linux内核快速倒车,初探Linux内核态——通过proc文件系统作快速问题定位
这篇博客的内容完全是关于现代Linux内核的.换句话说,指的是与RHEL6一样使用的2.6.3x系列内核,而不是古老的RHEL5所使用的2.6.18内核(都什么鬼了?!),虽然大部分企业都还在使用RH ...
- 通过/proc查看Linux内核态调用栈来定位问题
文章目录 1.定位一个"运行慢"的进程 2.strace -cp 27288 3. pstack 27288 3.进程状态和WCHAN字段 4.进程有什么活动或者完全挂死了? 5. ...
- Linux 内核的文件 Cache 管理机制介绍
1 前言 自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,使用得非常广泛,它与 Windows.UNIX 一起占据了操作系统领域几乎所有的市场份额.特别是在高性能计算 ...
- Linux内核态抢占机制分析
http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html [摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核( ...
- Linux内核态之间进程通信,Linux 系统内核空间与用户空间通信的实现与分析[转载]...
[https://www.ibm.com/developerworks/cn/linux/l-netlink/index.html] 多数的 Linux 内核态程序都需要和用户空间的进程交换数据,但 ...
- Linux内核Makefile文件
Linux内核Makefile文件(翻译自内 核手册) 转载自:http://blog.chinaunix.net/uid-21651676-id-60377.html Linux 内核Makefil ...
- linux的头文件下载,Linux内核头文件(linux headers)
更新 Linux 内核头文件(linux headers) 三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文 ...
最新文章
- 用Handler的post()方法来传递线程中的代码段到主线程中执行
- linux存储--文件描述符fd与FILE结构体(二)
- 通信工程专业的一些小知识点
- Java普通对象的内存配置
- android ColorDrawable的使用
- Ural_1003 Parity(并查集)
- 忆当年!董明珠处罚困难员工后自掏腰包补偿:制度必须坚决执行
- 【java】RMI教程:入门与编译方法 远程
- ArrayList 类方法toArray的一点疑惑
- shell 模拟多进程(3)
- Django 2.0.1 官方文档翻译: 文档目录 (Page 1)
- 继续学习-CSS3页面美化之静态美化
- 用HTML5绘制的一个星空特效图
- wireshark的usb抓包分析 2 - 分析数据
- 网站title,meta,description如何设置,长度大小多少合适!
- Java使用poi操作ppt
- 【干货收藏】测试人员必看的经典书籍
- echarts实现离线世界地图(国内)展示
- SONY未来概念电子本
- 计算机系统结构专业是工学还是理学,理科有哪些专业和工作 理学和工学的区别解析...
热门文章
- 中科大少年班,阿里云首席科学家闵万里离职,发内部信告别!
- MR-GMMapping:基于高斯混合模型的通信高效多机器人映射系统
- 【Spikingjelly】SNN框架教程的代码解读_4
- html touch时没有阴影,4399touch怎么玩 Touch游戏常见问题汇总
- java乐视面试题_java面试题经典解读
- 2022最新鸽哒IM即时通讯系统源码+带安装教程
- 苹果app退款_苹果上最流氓的功能,终于被彻底关掉,还退款208元
- Android中使用Room(ORM关系映射框架)对sqllite数据库进行增删改查
- RPG游戏制作-03-人物行走及A*寻路算法
- 酒香也怕巷子深,教你一招,轻松让百度收录你的个人站点