Linux驱动程序中的file,inode,file_operations三大结构体

本文允许转载,但请标明出处:http://blog.csdn.net/u010944778/article/details/45077565

file_operations:

    该结构是将系统调用驱动程序连接起来,这个结构的每一成员都对应着一个系统调用当用户进程利用系统调用对设备进行读写操作的时候,这些系统调用通过设备节点中的主设备号和次设备号来确定相应的驱动程序,而每一个字符驱动在linux内核中又是由cdev结构体来描述的,其中cdev结构体中含有成员fops结构体,然后就可以读取file_operations结构体中相应的函数指针,接着把控制权交给函数,从而完成linux设备驱动程序的工作。

一般的设备驱动程序通常用到以下5种操作:

struct file_operations
{
	ssize_t (*read)(struct file *,char *, size_t, loff_t *);//从设备同步读取数据
	ssize_t (*write)(struct file *,const char *, size_t, loff_t *);
	int (*ioctl) (struct  inode *,  struct file *, unsigned int,  unsigned long);//执行设备IO控制命令
	int (*open) (struct inode *, struct file *);//打开
	int (*release)(struct inode *, struct file *);//关闭
};


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

具体到应用程序中:

fd=open("/dev/hello",O_RDWR)

通过系统调用open()来打开设备文件,此设备节点对应有一个设备号

打开 /dev/hello时,通过主次设备号找到相应的字符驱动程序。即在cdev链表中找到cdev这个结构体,

cdev里面又包含了file_operations结构体,含有对设备的各种操作,打开时即调用里面的.open 函数指针指向的open函数。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


file:
    表示一个打开的文件(文件的描述符),由内核在open()时创建,并(将该文件描述符)传递给该文件上进行操作的所有函数,直到最后的close函数,在文件的所有实例都被关闭后,内核会释放这个数据结构。
主要供与文件系统对应的设备文件驱动程序使用。

struct file
{
	mode_t f_mode;//表示文件是否可读或可写,FMODE_READ或FMODE_WRITE
	dev_ t  f_rdev ;// 用于/dev/tty
	off_t  f_ops;//当前文件位移
	unsigned short f_flags;//文件标志,O_RDONLY,O_NONBLOCK和O_SYNC
	unsigned short f_count;//打开的文件数目
	unsigned short f_reada;
	struct inode *f_inode;//指向inode的结构指针
	struct file_operations *f_op;//文件索引指针
}
 


inode:
    在linux中inode结构用于表示文件,file结构表示打开的文件的描述,因为对于单个文件而言可能会有许多个表示打开的文件的描述符,因而就可能会的对应有多个file结构,但是都指向单个inode结构。
该结构里面包含了很多信息,但是,驱动开发者只关心里面两个重要的域:
dev_t i_rdev; //含有真正的设备号
struct cdev *i_cdev; //struct cdev是内核内部表示字符设备的结构.

 
三者之间关系:
    struct file结构体中包含有struct file_operations结构体,struct file_operations是struct file的一个域;我们在使用系统调用open()打开一个设备节点struct inode时,我们会得到一个文件struct file,同时返回一个文件描述符,该文件描述符是一个整数,我们称之为句柄,通过访问句柄我们能够访问设备文件struct file,描述符是一个有着特殊含义的整数,特定位都有一定的意义或属性。

 
Reference :
http://blog.163.com/seven_7_one/blog/static/16260641220112710311323/

http://liurugongzi.blog.sohu.com/104834407.html

http://blog.csdn.net/dreaming_my_dreams/article/details/8272586

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核驱动程序的`file`, `file_operations`, 和 `inode` 结构体是操作系统文件系统核心组件的关键部分,它们之间存在着紧密的关系: 1. **file**: 这是一个用户空间的抽象,代表一个打开的文件描述符。当用户进程打开一个文件时,内核会为该进程创建一个`file`结构体实例。`file`包含了许多信息,如文件描述符、缓冲区管理、以及与用户空间交互的接口。 2. **file_operations (fops)**: 这是一个指向`struct file_operations`的指针,也称为`file_operations table`。它是内核用于描述一个文件的行为的函数表,包含了处理文件的各种操作,如读写、关闭、打开等。每个具体的文件类型(如普通文件、目录、特殊设备等)都有对应的fops,由驱动程序或内核模块定义。 3. **inode**: 是文件系统的基本存储单元,用于存储文件或目录的基本属性,如权限、所有者、大小、数据块映射等。每个打开的文件都关联着一个inode, inode号是文件系统唯一的标识符。`file`结构体的`inode`字段就是用来存储与特定文件相关的inode信息。 关系总结: - `file`结构体依赖于`file_operations`,因为文件的行为是由fops定义的。 - `file`结构体通过其`inode`字段引用了实际的`inode`结构体,以便访问文件的元数据。 - 驱动程序在初始化`file_operations`时,通常会设置对应的`inode_operations`,这些操作与特定类型的inode相关,比如对于目录类型的inode,会处理目录遍历等特殊行为。 相关问题: 1. 为什么要使用`file_operations`来描述文件行为? 2. 驱动程序如何通过`file`结构体与`inode`交互? 3. 如何在内核为特定类型的文件定义定制的`file_operations`和`inode_operations`?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值