首页 理论教育深入剖析Linux内核与设备驱动:重要概念解析

深入剖析Linux内核与设备驱动:重要概念解析

【摘要】:谈到Linux内核,大家的第一感觉就是一个庞大的系统、很多的模块和功能,实在是太复杂了。Linux内核在设计过程中这些都已考虑在其中,这也就提升了它的适用范围。抽象是人类的一个重要思维能力,从某种角度来说软件系统是对各种概念或者行为进行抽象,并加以管理。

谈到Linux内核,大家的第一感觉就是一个庞大的系统、很多的模块和功能,实在是太复杂了。究竟如何入手是个问题。对系统的理解有很多的方法:自顶向下、自底向上等。笔者更认同自顶向下按层次分析的方法。顶部是用户的直接接口和需求体现,按照需求从整体到局部会更容易理解系统,也更容易设计与实现系统。整本书的论述也是从需求出发试图按照What(需求是什么)→How(如何实现)的逻辑解释系统、子系统及各个模块。

本书中还会涉及一些重要的概念,如资源、数据、数据流、接口、临界区、锁、执行实体、上下文、同步、异步、时间、空间和抽象等。需要读者对这些概念有基本的认识。下面重点介绍这些概念与需求之间是怎样的关系。

首先需求分为功能需求和性能需求,这两种需求都会影响系统的实现。

在实现需求的时候要考虑资源,有哪些资源可以使用,如何使用来满足需求,这些都是要考虑的。需要注意的一点是资源通常都是共享的,对某个共享资源的管理使用通常就会抽象成系统的一个模块。对硬件来说,处理器、memory、clock、power supplier、DMA、中断等都是资源。

在系统中各种资源围绕什么进行操作呢?是数据。数据可以加上不同的限制条件,换句话说数据可以组织成不同的形式。数据经由不同的模块处理可以理解为数据在不同的模块之间流动,笔者称之为数据流。数据流经过相邻两个模块时,双方要知道数据是如何组织的,从而才能形成接口。系统的设计与实现中一定要有数据流的概念还要明确接口的数据组织形式。这样才更容易理解系统是如何运作的,以设计出更好的系统。另外当不同的实体共享数据时,需要对共享数据进行保护,避免不同实体同时访问共享数据,这个保护区域就是临界区,保护方法是加锁。(www.chuimin.cn)

对处理器这一资源的使用要有执行实体的概念,执行实体的运行受处理器的执行级别和运行状态的影响,软件通常是通过不同的栈来区分级别(如进程栈和中断栈),Linux内核中断实现是借用当前进程的内核栈来执行。不同的执行实体与处理器的执行级别和状态一起形成上下文的概念。不同的上下文在临界区时需要不同级别的锁。

其次对需求的实现方法通常有同步、异步两种方式,需要注意的是同步、异步概念在软件和硬件上是不同的。软件中同步是指发送方发出数据后,等接收方发回响应以后才发下一个数据包的通信方式;异步是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通信方式。硬件中同步信号和时钟信号有关,实际上输入信号和时钟信号进行了与运算或与非运算,输入信号和时钟信号的运算结果为有效状态时,器件的状态才会改变;异步输入信号和时钟信号无关,输入信号变为有效状态时,器件的状态就会立即改变。可见软件和硬件对同步、异步的理解所站的立场不同,软件站在发送者的立场,硬件则是站在接收者如何确认数据有效的立场,这与软件和硬件的不同特点是分不开的。这些概念我们要有,并且需要在驱动的设计与实现中随时站在不同的立场上考虑问题。需要注意:软件、硬件的同步、异步的概念虽然有区别,但是也有关联。比如软件中,异步概念的实现很多时候是通过硬件的异步事件(如中断)来实现的。

在实现需求时还要考虑时间、空间的概念。这里时间主要是性能需求,空间主要是对存储资源的占用。计算机专业的学生经常会听到老师讲“时间换空间,空间换时间”,这句话体现了效率和资源之间置换的思想,如果想提高效率通常就要多占用资源,相应的如果资源是瓶颈就要牺牲效率。所以在系统设计实现中一定要首先搞清楚效率和资源的关系,如果本末倒置,系统必定失败。Linux内核在设计过程中这些都已考虑在其中,这也就提升了它的适用范围。

最后,软件实现需要进行抽象。抽象是人类的一个重要思维能力,从某种角度来说软件系统是对各种概念或者行为进行抽象,并加以管理。抽象在系统设计中主要体现在将共性提取形成概念,抽象的概念通常包括属性及其相应的行为,这在内核的设计中处处可见,比如file结构为各种文件的抽象。各种硬件资源在内核中也会有相应的抽象实体存在。我们在学习内核的过程中经常考虑这些抽象概念包括哪些属性以及如何操作,就像走了一遍内核的设计过程。比起一味的死记硬背会更好地帮助我们理解系统。