具体分析设备模型中的设备管理,首先要分析device结构。从device可见,重点是管理的资源,当然也包含针对sys文件系统关联的属性。而设备的层次关系在实际的情况下通常是从逻辑层的功能设备逐渐到物理层的总线设备,最终到platform bus中对应的device,这样系统就建立了完整的设备层次关系。设备模型通知udev的方式如图5-19所示。通过uevent通知到应用层,就完成设备管理创建设备文件到应用层的操作。......
2023-11-22
设备可以说是在内核管理中最具复杂性和多样性的部分,如图5-9所示。从图5-9可见,设备类型如此繁杂,需要管理各种不同并且差异极大的设备,在系统层面又要对它们进行统一管理,实现难度非常大。主要的难度体现在既要适应这些多样性还要提供统一的视角来进行管理。
设备管理要对各种不同设备进行生命周期管理、电源管理、设备发现以及驱动动态绑定和管理,这就要求有一个良好的模型对不同的设备在各个层面进行管理。这些是针对设备模型,在内核内部资源管理方面提出的需求。另外一个重要的需求是站在用户的角度,希望设备模型能够提供给用户一个框架,通过该框架用户可以方便地观察设备状态和设置设备属性。
1ᤫ物理设备管理的整体抽象模型
先来看看设备模型如何满足物理设备管理的需求,在介绍硬件的时候可以看到很多物理设备都是挂在物理总线上的,而处理器内部特别是SoC内部的设备虽然有片内总线,但是片内总线是硬件逻辑并没有软件抽象的管理实体,这样内部的设备就显得散乱,为了完成以上的管理需求,内核将整个系统的物理设备进行了一定的抽象组织,形成了抽象总线加物理总线的框架结构如图5-10所示。
图5-9 Linux内核设备复杂多样性
图5-10 设备模型的抽象组织
从图5-10可见,设备模型通过抽象的platform bus将与处理器联系紧密(片内设备)但逻辑并不相关的物理设备组织在一起,这样从整体上整个物理系统就形成了总线加设备的组织结构。另外由于设备是需要相应地操作才能工作,需要将这些操作抽象成为设备驱动。对整个物理设备系统进行总结,只需要总线、设备驱动和设备三个管理实体就可以完成管理物理设备的需求,这些总线上的物理设备相应的生命周期、驱动绑定以及管理就可以通过总线来完成。
在介绍设备分类的时候,将设备分为功能型设备和总线型设备,这里看到的模型是通过总线管理各种物理设备,但是此模型并没有完全站在用户使用的视角考虑,用户的视角更关心的是设备的功能,所以同样需要进行功能型设备的管理,虽然在物理上它们是一个设备,但是逻辑上应该分开管理(逻辑功能设备会和物理设备关联),于是将功能型设备的管理放入功能框架中进行就显得比较合理,只是要与设备模型框架进行交互。
2ᤫ观察、设置和管理设备的解决方案
对用户从各种角度方便地观察和设置设备的需求,最好采用Linux统一的方式———文件系统,内核针对性的设计了sys文件系统框架来满足这些需求。整个sys系统框架如图5-11所示。
图5-11 sys文件系统组织
从图5-11可见,sys文件系统提供了总线(bus)管理的视角和功能分类(class)管理的视角,另外还提供了整体的电源管理以及系统参数的设置。
内核中数据结构与sys文件系统关系如图5-12所示。
从图5-12可见,实际的设备和驱动是通过kobject来进行管理的,而上层的kset和sub-system更多是用来组织相关的底层设备模型中的设备和驱动,而最下层的attribute(属性)是与设备和驱动等相关的实体表示为sys文件系统的文件。
图5-12 sys文件系统与数据结构关系
先来看看重要的数据结构kobject,其内容如下:
kobject承担了两部分的管理功能。其一是通过kref承担了生命周期管理(通过引用计数实现)功能,kobject是高度的抽象实体,对具体的实体(注意这些实体可以不是设备或者驱动,而是一些模块属性)生命周期的状态和管理则通过内嵌kobject来完成,这样需要抽象的kobject到具体实体的转换,这种转换通过ktype来实现,转换通常是在具体的实体释放以及sys文件系统的操作中需要。(www.chuimin.cn)
针对这些功能,内核提供了一系列接口进行相关操作,首先是引用计数的接口,具体如下:
这些接口主要是针对引用计数的增减进行操作,release中可以进行抽象到具体的转换,相应的允许内核除kobject之外包含kref的实体,进行生命周期的管理。
对设备模型中的kobject内核提供如下的接口进行生命周期的管理:
下面以kobject_put为例看一下是如何实现的:
可见其就是使用kref的接口进行,其中有相对于kref具体的转换接口kobject_release。kobject_release中会调用kobject_cleanup,下面来看看kobject_cleanup的具体实现:
这样就实现了生命周期的管理功能。
kobject的另一个功能就是完成sys文件系统的组织功能,通过parent、kset、sd等链接完成该功能。相应的组织关系如图5-13所示。
关于设备模型的初始化,相关工作并不需要太早执行只要在具体的设备初始化之前执行即可,图5-14展示了内核设备模型在整个系统的初始化的位置及流程,这对理解设备模型有着实际的意义。
从图5-14可见,具体的设备模型的初始化流程在系统已经基本初始化完毕后执行,这时候sys文件系统作为一种特殊的文件系统已经注册并初始化,具体的设备初始化会在do_initcalls以函数表的形式进行,在这之前就是设备模型初始化的好时机,由driver_init来完成,其内部会进行总线管理初始化,功能设备管理初始化,platform总线初始化等。其中会向sys文件系统中添加对应的节点。sys文件系统中设备相关的初始化则在devices_init中执行,细节如图5-15所示。
图5-13 sys文件系统数据结构组织关系
图5-14 设备模型初始化
图5-15 sys文件系统设备相关初始化
从图5-15可见,主要的几个与device相关的目录在此创建,为后续实体在相应目录下创建做准备。这样就对设备模型的设计框架有了基本的认识。
有关深入剖析Linux内核与设备驱动的文章
具体分析设备模型中的设备管理,首先要分析device结构。从device可见,重点是管理的资源,当然也包含针对sys文件系统关联的属性。而设备的层次关系在实际的情况下通常是从逻辑层的功能设备逐渐到物理层的总线设备,最终到platform bus中对应的device,这样系统就建立了完整的设备层次关系。设备模型通知udev的方式如图5-19所示。通过uevent通知到应用层,就完成设备管理创建设备文件到应用层的操作。......
2023-11-22
DM 3730的I2C控制器框架如图7-4所示。图7-4引自《DM 3730芯片手册》中第2798页的框图。关于DM 3730I2C的驱动部分,主要分析相关初始化和总线传输的操作。由于I2C作为控制和获取状态信息,数据量并不大,而且相关的操作频率并不高,这样在中断中进行相关的处理,对系统的影响并不大。......
2023-11-22
图3-3Linux内核整体框架③bridges:桥梁层。Linux内核通过统一的接口操作设备,这样就屏蔽了各个设备的差异,从而降低了和硬件的耦合关系。Linux内核为了简化实现,将共享资源的进程作为线程。考虑到外部事件需要对执行流程进行转换,另外不同的应用执行流程之间需要切换,这就要在Linux内核的逻辑层抽象出调度器这一逻辑功能。......
2023-11-22
也正是因为Linux内核的唯一性,各个不同发布版本拥有相同的框架。Linux内核是在整个Linux系统的最底层,它负责管理硬件,运行用户程序,并保持系统整体的安全性和完整性。可以说是Linux系统的根和灵魂。图3-1中看到Linux内核还有另一层面的含义。这对于Linux内核同样适用。所以对Linux内核的剖析、学习和研究也不能独立于系统进行,而是要综合考虑应用、内核和硬件等各方面的信息和内容。这样才能更全面、深刻地理解Linux内核。......
2023-11-22
USB的设计为非对称式的,它是主从式总线,任何USB事务都是由主机引发的。USB总线拓扑如图7-12所示。图7-12引自《USB2.0规范》。USB总线已经成为使用最广泛的设备连接标准。每个USB设备至少有两个端点/管道,分别是进和出两个方向,编号为0,用于控制总线上的设备。总体上来说,系统对USB总线驱动的需求就是要能按规范实现总线的各种功能,并且满足总线的各种无关性的需求。......
2023-11-22
SPI是一种高速、全双工、同步总线。这样就允许单个SPI总线上连接多个SPI从设备。对于SPI总线从设备并没有固化的地址,而是通过CS信号区分不同的设备。另外因为SPI总线频率最高可以达到70MHz,所以需要较大吞吐量的操作方案进行数据传输,通常使用DMA进行操作。总体上来说,系统对于SPI总线驱动的需求就是要能实现总线的各种功能,并且满足类似于I2C总线的各种无关性需求。图7-5SPI总线数据传输信号规范......
2023-11-22
VFS的实现是以“一切皆是文件”为需求出发点的。要理解VFS的框架首先看一下VFS和系统的静态关系框图,如图5-1所示。从图5-1可见,VFS是用户层的直接接口,是面向用户的服务。图5-1VFS和系统静态关系图在图5-2中每个节点被使用时都会在VFS层中创建dentry,这样可以快速通过文件名进行查找和定位,Linux内核中对dentry的管理组织形式如图5-3所示。以上是系统运行时VFS对文件名的组织管理,这是VFS管理的一个方面。......
2023-11-22
谈到Linux内核,大家的第一感觉就是一个庞大的系统、很多的模块和功能,实在是太复杂了。Linux内核在设计过程中这些都已考虑在其中,这也就提升了它的适用范围。抽象是人类的一个重要思维能力,从某种角度来说软件系统是对各种概念或者行为进行抽象,并加以管理。......
2023-11-22
相关推荐