应用程序和VFS之间的接口是系统调用

应用程序和VFS之间的接口是系统调用,而VFS与磁盘文件系统以及普通设备之间的接口是file_operatioons结构体成员函数,这个结构体包含对文件进行打开、关闭、读写、控制等一系列成员函数。由于字符设备的上层没有磁盘文件系统,所以字符设备的file_operations成员函数就直接由设备驱动提供了,因此file_operaion也是字符设备驱动的核心。而对于块设备而言,ext2、fat、jffs2等文件系统中会实现针对VFS的file_operations成员函数,设备驱动将看不到file_operation的存在。

file结构体代表一个打开的文件,系统中每个打卡的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。
innode 结构体用来记录文件的访问权限。属主、大小、生成时间、修改时间等物理信息,它是linux管理文件系统的最基本单位。一个文件可以对应多个file,但只对应一个innode 。 对于每一个存储设备或分区,在被格式化为文件系统后,都应包含两部分,innode 和 block 。其中,innode 用以存储文件信息,而block 用以存储数据。操作系统能够根据 innode 快速找到文件。

主设备号是与驱动对应的概念,同一类设备一般使用相同的主设备号。因为同一驱动可支持多个同类设备,因此用次设备号来描述使用该驱动的设备的序号,序号一般从0开始。

static struct char_device_struct {
 struct char_device_struct *next;  // 同一主设备号下可能有多个次设备,且其可能并不是一次添加的,此时就用到了next域。否则
此域就是NULL 例如主设备号为10:{1-5}~{6-7}~{9-11}。顺序一定是小的次设备号在前
 unsigned int major; //主设备号
 unsigned int baseminor; //最小次设备号,本链表节点
 int minorct; //设备个数 ,本链表节点
 char name[64]; //设备名 ,本链表接点
 struct cdev *cdev; /* will die */
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];

你可能感兴趣的:(应用程序和VFS之间的接口是系统调用)