Chinaunix首页 | 论坛 | 博客
  • 博客访问: 549672
  • 博文数量: 181
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 15:17
个人简介

用发呆的时间来理清自己的思绪

文章存档

2015年(7)

2014年(134)

2013年(40)

分类: 嵌入式

2014-10-05 21:22:46

    最近在看宋宝华的设备驱动第二版,发现很多东西看完就会忘记,因此以博客的形式整理出来,以备复习。
一、无操作系统时的设备驱动

    在产品的开发过程中,并不是任何一个计算机系统都一定要运行操作系统,在许多情况下,操作系统都不存在,对功能比较单一、控制并不复杂的系统,比如公交车的刷卡机、电冰箱、微波炉、空调等简单的设备,并不需要多任务调度、文件系统、内存管理等复杂的功能,用单任务架构完全可以良好地支持他们的工作,这种系统的一般架构就是:在一个死循环中实现对设备中断的检测或者对中断的轮询。
    在这样的系统中,虽然不存在操作系统,但是设备驱动则无论如何都必须存在,一般的做法是每种设备驱动都会定义为一个文件模块,包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行具体的驱动实现。其它的模块需要使用这个驱动的时候,只需要包含设备驱动的头文件,然后调用其中的外部接口函数。
    由此可见,没有操作系统的情况下,设备驱动的接口是直接提交给了应用软件工程师,应用软件没有跨越任何层次就直接访问了设备驱动的接口,驱动包含的接口函数也与硬件的功能直接吻合,没有任何附加功能。

二、有操作系统时的设备驱动
    没有操作系统的设备驱动,它直接运行在硬件之上,不与任何操作系统关联,当系统中包含操作系统之后,设备驱动会变的怎样?
    首先,不论是否有无操作系统,设备驱动的硬件操作工作仍然是不可少的,没有这一部分,驱动不可能与硬件打交道。
    其次,我们知道驱动是操作系统内核的一部分,就单从到代码量来说,对于Linux源码,其中65%的代码都是驱动程序,由此可见,驱动在操作系统中的地位,因此,有操作系统时,我们必须把驱动要融入到操作系统内核,为了实现这种融合,必须在所有设备的驱动中和设计面向操作系统内核的接口,这样的接口由操作系统规定,对一类设备而言结构一致,独立于具体的设备。
    由此可见,当系统中存在操作系统的时候,驱动变成了链接硬件和操作系统内核的桥梁,如下图所示:
    
    由于操作系统的存在,势必要求设备驱动附加更加多的代码和功能,把单一的“驱使硬件设备行动”变成了操作系统和和硬件打交道的模块,它对外呈现为操作系统的API,不给应用软件工程师直接提供接口。
    可能有人会问,有了操作系统之后,驱动反而变得复杂,那要操作系统干什么?
    首先,一个复杂的软件系统需要处理多个并发的任务,没有操作系统,想完成多任务并发是很困难的。
    其次,操作系统给我们提供内存管理机制,典型的例子就是比如Linux操作系统可以让每个进程都可以独立地访问4G的内存空间,其中0-3G是用户空间,3G-4G是内核空间。
    上述优点似乎并没有体现在设备驱动身上,操作系统的存在给设备驱动究竟带来了那些实质的好处?
    简而言之,操作系统通过给驱动制造麻烦来 达到给上层应用提供便利的目的。这一切的前提就是所有驱动都必须按照操作系统给出的独立于设备的接口而设计,那么,应用程序将可使用统一的系统调用接口来访问各种设备,对于类UNIX的Vxworks、Linux等操作系统而言,当应用程序通过write()、read()等系统调用的函数读写文件时就可以访问各种字符设备和块设备,而不论设备的具体类型和工作方式,这其实就是给即将融入操作系统的设备驱动进行了统一的规范,大家只要按照这个规范来,写的驱动才能够被操作系统所识别,这也就是以“不变”应付“万变”。
阅读(817) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~