《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动

1.6 Linux设备驱动
Android深度探索(卷1):HAL与驱动开发
随着计算机技术的不断发展,与计算机(也包括手机等计算设备)相关的硬件设备的种类也不断丰富起来。这就需要大量的Linux设备驱动来与这些硬件设备进行交互。为了使读者在学习如何编写Linux驱动之前对Linux驱动有一个初步的认识,本节介绍了设备驱动在整个操作系统中的作用以及设备驱动的分类。

1.6.1 设备驱动的发展和作用
任何一台计算机系统的运行都是由软硬件共同作用的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则是一堆废铁。在计算机软件发展的初期,并没有驱动的概念,在这个时期的软件都是直接访问计算机的硬件。一般会通过计算机上的各种元器件和接口(如网卡上的中断、I/O端口、串口、寄存器等)与要控制的硬件通信。例如,本书曾经使用TC2.0(DOS环境)直接和串口通信来获取外部设备中的数据。

应用程序与硬件直接通信从技术上当然没什么问题,但却未对应用软件程序员的职责做更细的划分,所造成的后果就是应用软件程序员也必须要了解外部设备与计算机之间的通信协议以及一些硬件的知识才能使应用程序与这些设备通信,例如,控制打印机。问题还不止这些,大家试想,现在有一个应用程序要将生成的电子表格输出到打印机。应用程序最开始是为A型号打印机做的,而此时A型号打印机恰好坏了,换了B型号的打印机。由于A型号打印机和B型号打印机的打印指令差别很大,这就造成原来的应用程序无法控制B型号的打印机,为了使应用程序可以正常使用B型号打印机,必须重新修改应用程序的源代码以适应B型号打印机的打印指令。通过这个案例很容易知道如果应用程序直接访问硬件,就会造成与硬件耦合度过高的情况。

为了解决上述问题,软件不得不向前发展(几乎所有的新技术和新理论都是为了应对曾经无法解决的问题或使问题解决得更好而出现的,也就是说,由需求决定出现哪些新的技术和理论)。降低软件和硬件之间的耦合度成为当前首要解决的问题。了解面向对象的读者会很容易想到,降低对象与对象之间耦合度最有效的方法是通过接口(Interface)对类进行抽象,也就是说,抽象度越高,耦合度越低。

抽象这个概念同样也可以用在硬件上。只要将同一类型(如打印机)但不同型号的设备抽象成统一的接口就可以很容易解决上述问题。毫无悬念,这个抽象硬件的任务就落在了“驱动”身上。

驱动是直接和硬件交互的一类程序,负责对硬件进行抽象。如前面提到的打印机的例子。如果设计一套抽象的打印机驱动,并提供应用程序可访问的API。那么就算换了其他型号的打印机,只要应用程序通过驱动来访问打印机,就不需要再修改应用程序的源代码。而且开发应用程序的程序员并不需要了解打印机的打印指令。在解决上述接口问题的同时,又产生了一个新的技术领域:驱动程序开发。当然,开发驱动程序的技术人员通常被称为驱动工程师。

1.6.2 设备的分类及特点
计算机系统的硬件主要由CPU、存储器和外设组成。随着技术的不断提高,芯片的集成度也越来越高,往往在CPU内部就集成了存储器和外设适配器。ARM、PowerPC、MIPS等处理器都集成了UART、USB控制器、SDRAM控制器等,有的处理器还集成了片内RAM和Flash。

驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核。Linux将存储器和外设分为3大类:

字符设备(Character devices);
块设备(Block devices);
网络设备(Network devices)。
字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标、键盘等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备与块设备并没有明显的界限,如Flash设备符合块设备的特点,但是也可以把它作为一个字符设备来访问。

字符设备和块设备的驱动设计有很大的差异,但对用户而言,它们都使用文件系统(Linux通过文件系统访问驱动)的操作接口open、close、read、write等函数进行访问。

在Linux系统中,网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点。Linux内核与网络设备的通信和Linux核与字符设备、块设备的通信方式完全不同。

另外,USB驱动、PCI驱动、LCD驱动等大体可归入上述3类设备,但对于这些复杂的设备,Linux系统还定义了独特的体系结构。

时间: 2024-08-16 17:06:22

《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动的相关文章

《Linux 设备驱动开发详解(第2版)》——导读

前言 本书第1版在2008年初出版以后,受到广大读者的支持和厚爱,累计销售1.6万册,从几年的市场和读者反馈看,在第1版中还存在一些不足,主要是以下几方面. 没有现成的开发环境,读者需要从头到尾构建,而构建需要花费很长的时间,许多时候会不成功,加之配套光盘中的实例没有Makefile,更加大了操作的难度. 没有配套的开发板,大量的基于S3C2410的实例读者身边如果没有可以直接运行的平台,就无法亲身体验这些驱动. 个别内容实用性不强或过于陈旧,也有个别知识点的讲解语言晦涩,读者不易理解,如pla

《Linux 设备驱动开发详解(第2版)》——1.4 Linux设备驱动

1.4 Linux设备驱动 Linux 设备驱动开发详解(第2版)1.4.1 设备的分类及特点 计算机系统的硬件主要由CPU.存储器和外设组成.随着IC制作工艺的发展,目前,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器.譬如,相当多的ARM.PowerPC.MIPS等处理器都集成了UART.I2C控制器.USB控制器.SDRAM控制器等,有的处理器还集成了片内RAM和Flash. 驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核.Linux

《Android深度探索(卷1):HAL与驱动开发》——1.1节Android系统架构

1.1 Android系统架构 Android深度探索(卷1):HAL与驱动开发 Android是一个非常优秀的嵌入式操作系统.经过几年的发展和演进,Android已经形成了非常完善的系统架构,如图1-1所示. 从图1-1可以看出,Android的系统架构分为4层.这4层所包含的内容如下. 第1层:Linux内核 由于Android是基于Linux内核的,因此,Android和其他Linux系统(如Ubuntu Linux.Fedora Linux等)的核心部分差异非常小.这一层主要包括Linu

《Android深度探索(卷1):HAL与驱动开发》——1.3节查看Linux内核版本

1.3 查看Linux内核版本 Android深度探索(卷1):HAL与驱动开发 目前Linux内核主要维护3个版本:Linux 2.4.Linux 2.6和Linux 3.x,大多数Linux系统都使用了这3个版本的内核,其中Linux 2.6是目前使用最广泛的Linux内核版本,Android就使用了该内核版本.而Linux 2.4由于其内部设计缺陷(主要是进程调度上的缺陷),除了一些遗留Linux系统,已很少有新的Linux系统使用Linux 2.4了.Linux 3.x是最新推出的Lin

《Android深度探索(卷1):HAL与驱动开发》——6.4节使用多种方式测试Linux驱动

6.4 使用多种方式测试Linux驱动 Android深度探索(卷1):HAL与驱动开发 在上一节已经实现了一个简单的Linux驱动程序,该驱动的功能是统计给定字符串中的单词数,并且在最后已经将该Linux驱动的源代码成功编译成动态Linux驱动模块word_count.ko.下一步就是测试该模块.测试的方法很多,最常用的就是直接在Ubuntu Linux中测试.当然,这对于本章实现的Linux驱动是没问题的,但是对于需要直接访问硬件的驱动在Ubuntu Linux上测试就不太方便.在这种情况下

《Android深度探索(卷1):HAL与驱动开发》——6.5节使用Eclipse开发和测试Linux驱动程序

6.5 使用Eclipse开发和测试Linux驱动程序 Android深度探索(卷1):HAL与驱动开发 在前面几节开发的word_count驱动和测试程序大多都需要在Linux终端进行编译(Android应用程序除外)和运行,而且也无法跟踪到Linux内核函数.变量.宏的内部(除非自己到Linux内核源代码中就寻找这些源代码文件),这并不利于深入了解Linux内核技术.在本节将为读者展示如何在Eclipse中开发Linux驱动程序,并且可以像跟踪Java代码一样直接跟踪到Linux内核源代码.

《Android深度探索(卷1):HAL与驱动开发》——1.5节如何学习Linux驱动开发

1.5 如何学习Linux驱动开发 Android深度探索(卷1):HAL与驱动开发 由于Linux的内核版本更新较快(稳定版本1至3月更新一次,升级版本1至2周更新一次),每一次内核的变化就意味着Linux驱动的变化(就算不需要修改驱动代码,至少也得在新的Linux内核版本下重新编译),所以Linux内核的不断变化对从事Linux驱动开发的程序员影响比较大.不过这对于学习Linux驱动开发来说影响相对较小.因为不管是哪个版本的Linux内核,开发Linux驱动的方法和步骤基本相同,只要掌握了一

《Android深度探索(卷1):HAL与驱动开发》——1.8节小结

1.8 小 结Android深度探索(卷1):HAL与驱动开发学习Linux驱动编程一定要了解Linux驱动只与Linux内核有关,与用户使用的Linux系统(Ubuntu Linux.Fedora Linux.Android等)无关.也就是说,不管是哪个Linux系统,只要使用了同样的Linux内核,驱动就可以通用.唯一可以判断Linux内核是否相同的方法就是Linux内核版本号.在1.4节介绍了Linux内核版本号的定义规则,只有组成内核版本号的五部分完全相同,才能说明两个Linux系统的内

《Android深度探索(卷1):HAL与驱动开发》——1.2节Android系统移植的主要工作

1.2 Android系统移植的主要工作Android深度探索(卷1):HAL与驱动开发Android移植可分为两部分:应用移植和系统移植.应用移植是指将如图1-1所示第4层的应用程序移植到某一个特定硬件平台上.由于不同硬件平台之间的差异,Android SDK API也有可能存在差异(有的厂商会修改部分Android SDK API以适应自身硬件的需要),或者将应用程序从低版本Android移植到高版本的Android上.为了保证应用程序可以在新的硬件平台正常运行,需要对源代码进行一些修改.当