2、linux字符驱动程序分析 --一般的设备文件与设备驱动程序值间的函数调用关系

Linux中虚拟文件系统,一般的设备文件与设备驱动程序值间的函数调用关系

这里写图片描述

  1. 当open函数打开设备文件时,可以根据设备文件对应的struct inode结构体描述的信息,还会分配一个struct file结构体。
  2. 根据struct inode结构体里面记录的设备号,可以找到对应的驱动程序,这里以字符设备为例。cdev结构体。此结构体描述来字符设备所有的信息,其中最重要一项就是字符设备的操作函数。
  3. 找到struct cdev结构体后,linux 内核就会将struct cdev结构体所在的内存空间首地址记录在
  4. 任务完成 ,VFS层会给应用层返回一个文件描述符(fd)。这个fd是struct file结构体对应

首先,系统调用open打开一个字符设备的时候,通过一系列调用,最终会执行到chrdev_open
(最终室通过调用到def_chr_fops中的)
Int chrdev_open(struct inode *inode,struct file *file)
1、根据设备号(inode->i_rdev),在字符设备驱动模型中查找对应的驱动程序,这通过kobj_lookup()来实现,kobj_lookup会返回对应驱动程序cdev的kobject.
2、设置inode->i_cdev,指向找到的cdev
3、将inode添加到vdev->list的链表中
4、使用cdev的ops设置file对象的f_op
5、如果ops中定义了open方法,则调用该open方法
6、返回执行完chrdev_open之后,file对象的f_op指向cdev的ops,因而之后对设备进行的read,writed等操作,就会执行cdev的相应的操作


VFS inode 包含文件访问权限、属住、组、大小、生成时间、访问时间、最后修改时间等信息。它是linux管理文件系统的最基础的单位,也是文件系统链接任何子目录、文件的桥梁。
内核使用inode结构体在内核内部表示一个文件。
(1)dev_t i_rdev
表示设备文件的结点,这个区域实际上包含了设备号
(2)struct cdev *i_cdev;
Struct cdev 是内核的一个内部结构,它是用来表示字符设备的,当inode指向一个字符设备文件时,此区域为一个指向inode结构的指针。


通过struct inode 中的I_cdev 成员可以找到cdev,而所有的字符设备都在chrdevs数组中
全局数组chrdevs包含了255(CHRDEV_MAJOR_HASH_SIZE的值)个struct char_device_struct 的元素,每一个对应一个主设备号,如果分配了一个设备号,就会创建一个struct char_device_struct 的对象,并将其添加到chrdevs中;这样chrdevs数组,我们就可以知道分配了哪些设备号。


1.注册设备号,通过调用__register_chrdev_region 来实现
2.分配一个cdev,通过调用cdev_alloc()来实现
3.将cdev添加到驱动模型中,这一步将设备号和驱动关联起来,通过调用cdev_add()来实现
4.将第一步中创建的struct char_device_struct 对象的cdev指向第二步中分配的cdev,由于register_chrdev()是老的接口,这一步在新的接口中并不重要。


在linux内核中,使用cdev结构体来描述一个字符设备,cdev结构定于:
(include\linux\cdev.h)
Kobj->内嵌的内核对象
Owner->该字符设备所在的内核模块的对象指针
file_operations —>该结构体描述了字符设备所能实现的方法,是极为关键的一个结构体
List->用来向内核注册的所有字符设备形成链表
Dev->字符设备的设备号,由主设备号和次设备号形成
Count->隶属于同一主设备号的次设备号的个数


Struct file
File结构体指示一个已经打开的文件,它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数,直到文件被关闭,如果文件被关闭,内核就会释放相应的数据结构。
若表示为filp 是指向这个结构体的指针。
主要成员:
Fmode_t f_mode
(在open或ioctl函数中可能需要检查此区域以确定文件的读\写权限)
Loff_t f_pos
如果想知道当前文件当前位置在哪,驱动可以读取这个值而不会改变其位置
Struct file_operations*f_op
与文件相关的各种操作,当文件需要迅速进行各种操作时,内核分配这个指针作为它实现文件的打开

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/81412279