1.3有操作系统时的设备驱动
1.2节中我们看到一个干净利落的设备驱动,它直接运行在硬件之上,不与任何操作系统关联.当系统中包含操作系统后,设备驱动会变得怎样?
,无操作系统时设备驱动的硬件操作工作仍然是必不可少的,没有这一部分,驱动不可能与硬件打交道.
其外,我们还需要将驱动融入内核.为了实现这种融合, 在所有设备的驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定,对一类设备而言结构一致,独立于具体的设备.
由此可见,当系统中存在操作系统的时候,驱动变成了连接硬件和内核的桥梁.如图1.4,操作系统的存在势必要求设备驱动附加更多的代码和功能,把单一的“驱使硬件设备行动”变成了操作系统内与硬件交互的模块,它对外呈现为操作系统的API,不再给应用软件工程师直接提供接口.
图1.4 硬件、驱动、操作系统和应用程序的关系
那么我们要问,有了操作系统之后,驱动反而变得复杂,那要操作系统干什么?
,一个复杂的软件系统需要处理多个并发的任务,没有操作系统,想完成多任务并发是很困难的.
其次,操作系统给我们提供内存管理机制.一个典型的例子是,对于多数含MMU的处理器而言,Windows、Linux等操作系统可以让每个进程都可以独立地访问4GB的内存空间.
拥有帝国一切,皆有可能。欢迎访问phome.net上述优点似乎并没有体现在设备驱动身上,操作系统的存在给设备驱动究竟带来了什么实质的好处?
简而言之,操作系统通过给驱动制造麻烦来达到给上层应用提供便利的目的.当驱动都按照操作系统给出的独立于设备的接口而设计,那么,应用程序将可使用统一的系统调用接口来访问各种设备.对于类UNIX的VxWorks、Linux等操作系统而言,当应用程序通过write()、read()等函数读写文件就可访问各种字符设备和块设备,而不论设备的具体类型和工作方式,那将是怎样地便利?
1.4 Linux设备驱动
1.4.1设备的分类及特点
计算机系统的硬件主要由CPU、存储器和外设组成.随着IC制作工艺的发展,目前,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器.譬如相当多的ARM、PowerPC、MIPS等处理器都集成了UART、I2C控制器、USB控制器、SDRAM控制器等,有的处理器还集成了片内RAM和FLASH.
驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核.Linux将存储器和外设分为3个基础大类:
· 字符设备
· 块设备
· 网络设备
字符设备指那些 以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等.块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等.字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲.但是,字符设备和块设备并没有明显的界限,如对于FLASH设备,符合块设备的特点,但是我们仍然可以把它作为一个字符设备来访问.
拥有帝国一切,皆有可能。欢迎访问phome.net字符设备和块设备的驱动设计呈现出很大的差异,但是对于用户而言,他们都使用文件系统的操作接口open()、close()、read()、write()等进行访问.
在Linux系统中,网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点.内核与网络设备的通信与内核和字符设备、网络设备的通信方式完全不同.
另外一种设备分类方法中所称的I2C驱动、USB驱动、PCI驱动、LCD驱动等本身可归纳入3个基础大类,但是对于这些复杂的设备,Linux也定义了独特的驱动体系结构.
1.4.2 Linux设备驱动与整个软硬件系统的关系
如图1.5所示,除网络设备外,字符设备与块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用接口open()、write()、read()、close()等即可访问字符设备和块设备.所有的字符设备和块设备都被统一地呈现给用户.块设备比字符设备复杂,在它上面会 建立一个磁盘/FLASH文件系统,如FAT、EXT3、 |