DM 3730的I2C控制器框架如图7-4所示。图7-4引自《DM 3730芯片手册》中第2798页的框图。关于DM 3730I2C的驱动部分,主要分析相关初始化和总线传输的操作。由于I2C作为控制和获取状态信息,数据量并不大,而且相关的操作频率并不高,这样在中断中进行相关的处理,对系统的影响并不大。......
2023-11-22
谈到Linux内核,大家的第一感觉就是一个庞大的系统、很多的模块和功能,实在是太复杂了。究竟如何入手是个问题。对系统的理解有很多的方法:自顶向下、自底向上等。笔者更认同自顶向下按层次分析的方法。顶部是用户的直接接口和需求体现,按照需求从整体到局部会更容易理解系统,也更容易设计与实现系统。整本书的论述也是从需求出发试图按照What(需求是什么)→How(如何实现)的逻辑解释系统、子系统及各个模块。
本书中还会涉及一些重要的概念,如资源、数据、数据流、接口、临界区、锁、执行实体、上下文、同步、异步、时间、空间和抽象等。需要读者对这些概念有基本的认识。下面重点介绍这些概念与需求之间是怎样的关系。
首先需求分为功能需求和性能需求,这两种需求都会影响系统的实现。
在实现需求的时候要考虑资源,有哪些资源可以使用,如何使用来满足需求,这些都是要考虑的。需要注意的一点是资源通常都是共享的,对某个共享资源的管理使用通常就会抽象成系统的一个模块。对硬件来说,处理器、memory、clock、power supplier、DMA、中断等都是资源。
在系统中各种资源围绕什么进行操作呢?是数据。数据可以加上不同的限制条件,换句话说数据可以组织成不同的形式。数据经由不同的模块处理可以理解为数据在不同的模块之间流动,笔者称之为数据流。数据流经过相邻两个模块时,双方要知道数据是如何组织的,从而才能形成接口。系统的设计与实现中一定要有数据流的概念还要明确接口的数据组织形式。这样才更容易理解系统是如何运作的,以设计出更好的系统。另外当不同的实体共享数据时,需要对共享数据进行保护,避免不同实体同时访问共享数据,这个保护区域就是临界区,保护方法是加锁。(www.chuimin.cn)
对处理器这一资源的使用要有执行实体的概念,执行实体的运行受处理器的执行级别和运行状态的影响,软件通常是通过不同的栈来区分级别(如进程栈和中断栈),Linux内核中断实现是借用当前进程的内核栈来执行。不同的执行实体与处理器的执行级别和状态一起形成上下文的概念。不同的上下文在临界区时需要不同级别的锁。
其次对需求的实现方法通常有同步、异步两种方式,需要注意的是同步、异步概念在软件和硬件上是不同的。软件中同步是指发送方发出数据后,等接收方发回响应以后才发下一个数据包的通信方式;异步是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通信方式。硬件中同步信号和时钟信号有关,实际上输入信号和时钟信号进行了与运算或与非运算,输入信号和时钟信号的运算结果为有效状态时,器件的状态才会改变;异步输入信号和时钟信号无关,输入信号变为有效状态时,器件的状态就会立即改变。可见软件和硬件对同步、异步的理解所站的立场不同,软件站在发送者的立场,硬件则是站在接收者如何确认数据有效的立场,这与软件和硬件的不同特点是分不开的。这些概念我们要有,并且需要在驱动的设计与实现中随时站在不同的立场上考虑问题。需要注意:软件、硬件的同步、异步的概念虽然有区别,但是也有关联。比如软件中,异步概念的实现很多时候是通过硬件的异步事件(如中断)来实现的。
在实现需求时还要考虑时间、空间的概念。这里时间主要是性能需求,空间主要是对存储资源的占用。计算机专业的学生经常会听到老师讲“时间换空间,空间换时间”,这句话体现了效率和资源之间置换的思想,如果想提高效率通常就要多占用资源,相应的如果资源是瓶颈就要牺牲效率。所以在系统设计实现中一定要首先搞清楚效率和资源的关系,如果本末倒置,系统必定失败。Linux内核在设计过程中这些都已考虑在其中,这也就提升了它的适用范围。
最后,软件实现需要进行抽象。抽象是人类的一个重要思维能力,从某种角度来说软件系统是对各种概念或者行为进行抽象,并加以管理。抽象在系统设计中主要体现在将共性提取形成概念,抽象的概念通常包括属性及其相应的行为,这在内核的设计中处处可见,比如file结构为各种文件的抽象。各种硬件资源在内核中也会有相应的抽象实体存在。我们在学习内核的过程中经常考虑这些抽象概念包括哪些属性以及如何操作,就像走了一遍内核的设计过程。比起一味的死记硬背会更好地帮助我们理解系统。
有关深入剖析Linux内核与设备驱动的文章
DM 3730的I2C控制器框架如图7-4所示。图7-4引自《DM 3730芯片手册》中第2798页的框图。关于DM 3730I2C的驱动部分,主要分析相关初始化和总线传输的操作。由于I2C作为控制和获取状态信息,数据量并不大,而且相关的操作频率并不高,这样在中断中进行相关的处理,对系统的影响并不大。......
2023-11-22
整体的frame buffer框架如图6-5所示。了解frame buffer的框架还要先从为用户提供的接口开始。图6-7可变参数中硬件信息的含义固定信息是在frame buffer的操作过程中并不发生变化的。从整体分析,frame buffer的框架很直接,主要就是直接管理实际的设备,而相关的操作与应用层直接相关。......
2023-11-22
SPI总线框架对这两类设备进行管理,具体的框架如图7-6所示。通常的SPI驱动都是在内核实现并在内核态执行的,所以就不对spidev进行详细的分析。SPI总线框架整体的功能就是这样,接下来看看具体各部分的实现。在SPI总线框架中相应的实体是spi_board_info,内容如下:其中的主要信息是与总线信号相关的属性。......
2023-11-22
USB的设计为非对称式的,它是主从式总线,任何USB事务都是由主机引发的。USB总线拓扑如图7-12所示。图7-12引自《USB2.0规范》。USB总线已经成为使用最广泛的设备连接标准。每个USB设备至少有两个端点/管道,分别是进和出两个方向,编号为0,用于控制总线上的设备。总体上来说,系统对USB总线驱动的需求就是要能按规范实现总线的各种功能,并且满足总线的各种无关性的需求。......
2023-11-22
图3-3Linux内核整体框架③bridges:桥梁层。Linux内核通过统一的接口操作设备,这样就屏蔽了各个设备的差异,从而降低了和硬件的耦合关系。Linux内核为了简化实现,将共享资源的进程作为线程。考虑到外部事件需要对执行流程进行转换,另外不同的应用执行流程之间需要切换,这就要在Linux内核的逻辑层抽象出调度器这一逻辑功能。......
2023-11-22
1框架总体设计从输入设备框架的需求可知,内核的整个输入流程应该分为下层的各种输入设备和上层与用户的控制信息交互两个方面。从图6-1可见,输入设备系统框架的核心部分从底到上分为input driver,input core和event handler三个部分。应用层则要根据输入设备的事件进行相应的操作,为了给应用层统一的接口,输入设备框架对于输入事件进行了规范。......
2023-11-22
也正是因为Linux内核的唯一性,各个不同发布版本拥有相同的框架。Linux内核是在整个Linux系统的最底层,它负责管理硬件,运行用户程序,并保持系统整体的安全性和完整性。可以说是Linux系统的根和灵魂。图3-1中看到Linux内核还有另一层面的含义。这对于Linux内核同样适用。所以对Linux内核的剖析、学习和研究也不能独立于系统进行,而是要综合考虑应用、内核和硬件等各方面的信息和内容。这样才能更全面、深刻地理解Linux内核。......
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
相关推荐