首页 理论教育字符设备的重要数据结构

字符设备的重要数据结构

【摘要】:字符设备驱动程序编写通常都要涉及三个重要的内核数据结构,分别是file_operations结构体、file结构体和inode结构体。file_operations为用户态应用程序提供接口,是系统调用和驱动程序关联的重要数据结构。如果文件被关闭,内核就会释放相应的数据结构。struct cdevi_cdev;struct cdev是内核的一个内部结构,它是用来表示字符设备的,当inode结点指向一个字符设备文件时,此域为一个指向inode结构的指针。

字符设备驱动程序编写通常都要涉及三个重要的内核数据结构,分别是file_operations结构体、file结构体和inode结构体。

file_operations为用户态应用程序提供接口,是系统调用和驱动程序关联的重要数据结构。结构体中每一个成员都对应着一个系统调用,/dev目录下的设备文件和驱动程序的连接是通过file_operations结构体建立的。这个结构体的定义在内核源码的kernel/linux/fs.h中。file_operations结构体中的每个成员都是指向函数的指针,指向驱动中的函数,这些函数实现一个特别的操作,或者对于不支持的操作置为NULL。当指定为NULL时内核确切的行为针对每个函数是不同的。file_operations的主要成员如下所示:

file结构体在内核代码include/linux/fs.h中定义,表示一个抽象的打开的文件,file_operations结构体就是file结构的一个成员。File结构不仅仅限定于设备驱动程序,每个打开的文件在内核空间都有一个相应的struct file结构体,它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数,直至文件被关闭。如果文件被关闭,内核就会释放相应的数据结构。

inode结构表示一个文件,而file结构表示一个打开的文件。这正是二者间最重要的关系。

inode结构体包含了一大堆文件相关的信息,其结构体如下所示:(www.chuimin.cn)

就针对驱动代码来说,我们只要关心其中的两个域即可:

dev_t i_rdev;表示设备文件的结点,这个域实际上包含了设备号。

struct cdev∗i_cdev;struct cdev是内核的一个内部结构,它是用来表示字符设备的,当inode结点指向一个字符设备文件时,此域为一个指向inode结构的指针。