图5-21块设备内部框架2核心管理实体从整体的层次上看,块设备需要有针对文件系统和VFS的接口实体,另外还需要管理生命周期的设备模型相关实体以及驱动管理实体。图5-22块设备层各实体及系统关系框图从图5-23可见,文件系统中的设备层次由block_device来实现,驱动的管理实体通过gendisk来进行管理,hd_struct进行物理的分区管理,同时为设备模型的接口。图5-24块设备驱动管理实体从图5-24可见,其中主要包括设备的控制操作接口......
2023-11-22
下面介绍字符设备的框架,字符设备的核心数据结构是cdev,具体内容如下:
从相应的属性中可见,以上的需求都可以通过该结构进行管理。
1ᤫ生命周期管理
首先,在字符设备框架中,生命周期管理是通过kobj进行的,相应的管理已经通过字符设备框架进行封装,并通过对外的接口统一提供相关功能。包含生命周期管理的字符设备框架对外接口如下:
cdev_get设计成内部使用接口,在文件打开时通过chrdev_open进行调用,这样可以保证引用计数的增加,从而保证不被释放。
下面来看看在cdev生命周期结束时的操作:
为什么会有两个很接近的操作呢?这是由于对cdev的创建分别有静态地创建cdev_init和动态地创建cdev_alloc两种,对应用生命周期结束同样有两种、静态使用cdev_default_release、动态使用cdev_dynamic_release。动态比静态增加了释放内存的操作。但是cdev_purge的工作是什么呢?在需求讨论的时候提到了字符设备是对用户开放使用的,这里设备的生命周期结束时一般是驱动释放操作,相应的VFS中代表实际文件inode的属性就应该调整,该函数就是将inode与cdev的关联关闭,后续的打开设备文件操作会重新加载设备驱动,这样才能保证系统的正确性。
2ᤫ设备分类管理
对设备的分类和具体设备的管理,系统通过设备号来进行,设备号是具体设备的类型和实体的综合,与设备一一对应,由于通过设备号进行设备管理是通用的方式,同样适合于块设备,而不同的设备对设备号的管理方式会有差别,所以各自进行单独的设备号管理。
对抽象设备实体如cdev的管理,从设计的角度和设备号分离灵活性更高考虑,将二者进行分离管理。
下面详细分析设备号管理,对字符设备的设备号进行管理的核心实体是char_device_struct,详细内容如下:
字符设备分类比较特殊,并不是只通过主设备号来进行分类的,允许将主设备管理的子设备号分开表示不同类型的设备,作为主类型下面的子类型,每种类型有自己的驱动,char_device_struct就是用来进行这种分类管理以及和驱动绑定的。可见其中通过major主设备号,basemonor基本的子设备号以及minorct子设备数目来表示所管理的设备。相应管理的底层函数是在__register_chrdev_region中,相应的接口如下:
如果major设置为0,则进行主设备号的动态分配。相应的系统也提供静态申请设备号和动态申请设备号两个接口,分别如下:
其中register_chrdev_region为静态申请主设备号,alloc_chrdev_region为动态分配主设备号。
3ᤫcdev实体管理(www.chuimin.cn)
对字符设备来说,由于其主要为用户直接使用,而没有与内核中除VFS外的其他模块关联,所以设计时将cdev既作为对上层VFS的接口也作为对下层驱动框架的接口,来进行统一管理。另外在内核中针对字符设备和块设备类型设计了统一的设备驱动管理实体的管理框架,主要的数据结构如下:
其中dev为驱动管理的起始设备号,range为管理的范围,data对字符设备驱动来说就是指向cdev(也作为设备驱动管理实体)。
相应的内核提供添加和查找的功能,接口分别如下:
具体的由kobj_map负责添加,由kobj_lookup负责查找。
字符设备为了底层设备框架开发方便将添加接口封装为cdev_add以便调用,细节如下:
从代码中可见,其直接调用kobj_map来实现功能。
4ᤫ字符设备驱动注册流程
对字符设备驱动来说,由于其管理的设备号和管理实体cdev是分开管理的,所以字符设备驱动的注册流程是:首先进行所管理的设备号的申请(可以静态申请也可以动态申请);然后是管理实体cdev的申请(可以静态初始化和动态申请);最后通过cdev_add加入进行统一管理即可。新的字符设备驱动都是采用这种方式注册。
对于字符设备驱动的注册,老的内核使用register_chrdev进行,系统需要兼容老的内核,所以提供了接口函数__register_chrdev,而register_chrdev就是简单地调用__register_chrdev,下面通过__register_chrdev来了解新的注册过程。
驱动注册之后,就等待应用程序打开并使用相应的设备了。使用设备的操作都是由各种类型的驱动框架提供,相应的会调用驱动具体的接口函数。
5ᤫ设备操作的重载
字符设备作为上层的抽象设备,要担负起操作重载的工作,这部分工作是在VFS中完成的,接下来看看具体的实现:
重载对用户来说是不可见的,用户并没有感受到相应的重载过程。这样实现也是满足设备层次管理的需要。
有关深入剖析Linux内核与设备驱动的文章
图5-21块设备内部框架2核心管理实体从整体的层次上看,块设备需要有针对文件系统和VFS的接口实体,另外还需要管理生命周期的设备模型相关实体以及驱动管理实体。图5-22块设备层各实体及系统关系框图从图5-23可见,文件系统中的设备层次由block_device来实现,驱动的管理实体通过gendisk来进行管理,hd_struct进行物理的分区管理,同时为设备模型的接口。图5-24块设备驱动管理实体从图5-24可见,其中主要包括设备的控制操作接口......
2023-11-22
字符设备驱动程序编写通常都要涉及三个重要的内核数据结构,分别是file_operations结构体、file结构体和inode结构体。file_operations为用户态应用程序提供接口,是系统调用和驱动程序关联的重要数据结构。如果文件被关闭,内核就会释放相应的数据结构。struct cdevi_cdev;struct cdev是内核的一个内部结构,它是用来表示字符设备的,当inode结点指向一个字符设备文件时,此域为一个指向inode结构的指针。......
2023-11-19
下面以图3-2所示的处理器系统为例,说明PCI设备11向存储器进行DMA写的数据传送过程。本节不介绍PCI设备进行DMA读的过程,而将这部分内容留给读者分析。假定PCI设备11需要将一组数据发送到0x1000-0000~0x1000-FFFF这段存储器域的地址空间中。这个DMA写具体的操作流程如下。PCI设备11将数据发送到PCI设备42的第5、6步如下所示。......
2023-10-20
应用层对输入设备的基本使用主要是集中在读取相应的事件方面,具体事件传给哪个应用则是属于应用框架的范畴,与具体的UI控制紧密关联。对于Android框架来说,输入设备的相关操作是在EventHub中实现的,首先需要检查所有的输入文件,其是通过inotify来实现的。......
2023-11-22
本工程作为黄埔涌综合整治的关键性设施,如何合理安排设备的操作运行将直接影响到黄埔涌综合整治以后的受控程度。根据本工程的要求,对设备的操作运行进行了仔细全面的分析,归纳如下:首先闸门的启闭操作必须依据潮汛、潮位预报系统和珠江全流域的水文、水情预报系统所提供的实时水情信息进行。根据黄埔涌景观要求,前、后泄水闸闸门处于全关挡潮状态,使内涌水位不受外江潮水影响,保持在0.8m。......
2023-06-27
表5-23 卷板操作要点3.边缘加工在钢结构制造中,为了保证焊接质量和工艺性焊透及装配的准确性,不仅需将钢板边缘刨成或铲成坡口,还需将边缘刨直或铣平。对加工质量要求不高,并且工作量不大的边缘加工,可采用铲边。⑥高空铲边时,施工人员应系好安全带。端面铣削亦可在铣边机上进行加工。铣边机的结构与刨边机相似,但加工时用盘形铣刀代替刨边机走刀箱上的刀架和刨刀。其操作方法和使用的工具与气割相同。......
2023-08-22
电动座椅因操作方便、结构简单被广泛使用。电动座椅的传动装置主要包括变速器、联轴节、软轴及齿轮传动机构等。当驾驶员将座椅调整好后,按下储存和复位开关,电脑即将各位置传感器的信号储存起来,以便驱动调节电动机将座椅调整到原来的位置。要实现座椅位置的记忆与恢复,必须有座椅位置传感器。......
2023-08-27
相关推荐