Linux设备驱动重要数据结构之——struct file。
2018-03-04 15:34
295 查看
(写在前面:相信不少初学设备驱动的工程师在尝试编写驱动程序时,对于底层read、write等函数的参数列表中的两个数据结构比较疑惑,本文可以作为入门者进行学习时的一篇参考文章,帮助简单了解struct file这一数据结构。) struct file是设备驱动中所使用的一个核心数据结构,定义在include/linux/fs.h文件中。 该结构体描述了一个打开的文件,需要注意的是“打开的文件”,也就是说每打开一个文件或每打开一次文件,均会有这样的一个结构体数据产生,负责维护该结构体的对象是系统内核,再进一步说,是由VFS(Virtual File System)来维护的。
struct file中首先需要重点关注如下四个字段:f_op / f_mode / f_pos /f_flags 。 f_op :这是一个指向file_operations结构体的指针,每个驱动模块中都有这样一个数据结构,其成员是各种函数指针,指向实现各种文件操作的内核函数,驱动工程师需要自己实现这些函数,例如应用程序中的系统调用open(),最终会调用到驱动程序里file_operations 中 open指针所指向的你自己实现的打开函数。
f_mode :代表文件打开模式,由用户空间程序open函数传入,该字段通过FMODE_READ , FMODE_WRITE来识别文件是可读还是可写,或是二者皆可。
f_pos :代表当前读写位置,驱动中可以读取这个值,而不应该随意改变它。在读写时应当使用write和read函数的最后一个参数接收到的指针来更新读写位置,直接作用于该字段即可。当然也存在例外,也就是llseek中,该函数本身就是用来更改文件读写位置的。
f_flags :代表文件标志,可选值为O_RDONLY / O_NONBLOCK / O_SYNC,驱动中应当检查O_NONBLOCK标志来确认是否为非阻塞操作,其它标志位很少用。另外,当检查读写许可时,使用f_mode而不是f_flags。
需要注意的一点是,该结构体struct file与用户空间程序的FILE类型指针是不同的,这里的file是内核中的一个数据结构,不会出现在用户层程序中,而FILE是定义在C语言库中的一种数据类型,主要用于标准输入输出。
struct file中首先需要重点关注如下四个字段:f_op / f_mode / f_pos /f_flags 。 f_op :这是一个指向file_operations结构体的指针,每个驱动模块中都有这样一个数据结构,其成员是各种函数指针,指向实现各种文件操作的内核函数,驱动工程师需要自己实现这些函数,例如应用程序中的系统调用open(),最终会调用到驱动程序里file_operations 中 open指针所指向的你自己实现的打开函数。
f_mode :代表文件打开模式,由用户空间程序open函数传入,该字段通过FMODE_READ , FMODE_WRITE来识别文件是可读还是可写,或是二者皆可。
f_pos :代表当前读写位置,驱动中可以读取这个值,而不应该随意改变它。在读写时应当使用write和read函数的最后一个参数接收到的指针来更新读写位置,直接作用于该字段即可。当然也存在例外,也就是llseek中,该函数本身就是用来更改文件读写位置的。
f_flags :代表文件标志,可选值为O_RDONLY / O_NONBLOCK / O_SYNC,驱动中应当检查O_NONBLOCK标志来确认是否为非阻塞操作,其它标志位很少用。另外,当检查读写许可时,使用f_mode而不是f_flags。
需要注意的一点是,该结构体struct file与用户空间程序的FILE类型指针是不同的,这里的file是内核中的一个数据结构,不会出现在用户层程序中,而FILE是定义在C语言库中的一种数据类型,主要用于标准输入输出。
相关文章推荐
- linux设备驱动第三版笔记---->linux驱动重要数据结构之struct file
- linux设备驱动第三版笔记---->linux驱动重要数据结构之file_operations
- 对关于字符驱动的一些重要数据结构(file_operations, file, inode, cdev)的理解
- 一些重要的数据结构(file_operation,file和inode)
- 字符设备驱动程序中重要的三个数据结构file_operations、inode、file
- 字符设备驱动程序中重要的三个数据结构file_operations、inode、file
- linux设备驱动中重要的3个数据结构
- Linux设备驱动重要数据结构之——struct inode
- linux 笔记 关于struct file 结构下 private_data 数据结构的思考
- linux设备驱动中重要的3个数据结构
- linux 笔记 关于struct file 结构下 private_data 数据结构的思考
- 关于struct file 结构下 private_data 数据结构z作用
- linux设备驱动第三版笔记---->linux驱动重要数据结构之inode.
- linux设备驱动中重要的3个数据结构 &&Linux设备驱动模型几个基本数据结构模型:kobject,kset,subsystem
- linux设备驱动模型里两个重要的数据结构:class和class_device
- 字符设备驱动程序中重要的三个数据结构file_operations、inode、file
- 字符设备驱动程序中重要的三个数据结构file_operations、inode、file
- 算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了
- sk_buff有关的几个重要的数据结构
- file_operations结构体中几个重要函数的原型