Linux设备驱动概述(一)

1.1 设备驱动的作用
    任何一个计算机系统的运转都是系统中软硬件共同努力的结果,没有硬件的软件是空中楼阁,没有软件的硬件是一堆废铁。硬件是底层的基础,是所有软件得以运行的平台,代码最终会落实为硬件上的组合逻辑与时序逻辑;软件则实现了具体的应用,它按照各种不同的业务需求而设计,并完成用户的最终诉求。硬件较固定,软件则很灵活,可以适应各种复杂多变的应用。因此,计算机系统的软硬件相互成就了对方。
    但是,软硬件之间同样存在着悖论,就是软件和硬件不应该互相渗透入对方的领地。为尽可能快速地完成设计,应用软件工程师不想也不必关心硬件,而硬件工程师也难有足够的时间来顾及软件。譬如,应用软件工程师在调用套接字发送和接收数据包时,不必关心网卡上的中断、寄存器、存储空间、I/O端口、片选以及其他任何硬件词汇;在使用printf()函数输出信息时,不用知道底层是怎样把相应的信息输出到屏幕或者串口。
    应用软件工程师需要看到一个没有硬件的纯粹的软件世界,硬件必须透明地呈现给他。谁来实现硬件对应用软件工程师的隐形?也就是驱动工程师。
    对设备驱动最通俗的解释就是“驱使硬件设备行动“。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。
    由此可见,设备驱动充当硬件和应用软件之间的纽带,应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。在系统没有操作系统的情况下,工程师可根据硬件设备的特点自行定义接口。在有操作系统的情况下,驱动的架构则由相应的操作系统定义,驱动工程师必须按照相应的架构来设计驱动,这样,驱动才能良好地整合入操作系统的内核中。
    驱动程序负责硬件和应用软件之间的沟通,而驱动工程师负责硬件工程师和应用软件工程师之间的沟通。目前,随着通信、电子行业的迅速发展,全世界每天都会生产大量新芯片,设计大量新电路板,所以,会有大量设备驱动需要开发。这些驱动或运行在简单的单任务环境中,或运行在VxWorks、Linux、Windows等多任务操作系统环境中,它们发挥着不可替代的作用。
    1.2 无操作系统时的设备驱动
    并不是任何一个计算机系统都一定要有操作系统,在许多情况下,操作系统都不必存在。对于功能比较单一、控制并不复杂的系统,譬如ASIC( 一种为专门目的而设计的集成电路)内部、公交车的刷卡机、电冰箱、微波炉、简单的手机和小灵通等,并不需要多任务调度、文件系统、内存管理等复杂功能,用单任务架构完全可以良好的支持它们的工作。一个无限循环中夹杂着对设备中断的检测或者对设备的轮询是这种系统中软件的典型架构。
    在这样的系统中,虽然不存在操作系统,但是设备驱动则无论如何都必须存在。一般情况下,每一种设备驱动都会定义一个软件模块,包含.h和.c文件,.h文件定义该设备驱动的数据结构并声明外部函数,.c文件进行驱动的具体实现。其他模块想要使用这个设备时,只需要包含设备驱动的头文件,然后调用其中的外部接口函数。
    由此可见,在没有操作系统的情况下,设备驱动的接口被直接提交给应用软件工程师,应用软件没有跨越任何层次就直接访问设备驱动的接口。驱动包含的接口函数也与硬件功能直接吻合,没有任何附加功能。下图1.1所示为无操作系统情况下硬件、设备驱动与应用软件的关系。
图1.1
有的工程师把单任务系统设计成图1.2所示的结构,设备驱动和具体的应用软件模块之间平等,驱动中包含了业务层面上的处理,这显然不合理,不符合软件设计中高内聚、低耦合的要求。

图1.2

另一种不合理的设计是直接在应用中操作硬件的寄存器,而不单独设计驱动模块,如图1.3所示。这种设计意味着系统中不存在或未能充分利用可重用的驱动代码。

图1.3

猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/80167104
今日推荐