资源预览内容
第1页 / 共415页
第2页 / 共415页
第3页 / 共415页
第4页 / 共415页
第5页 / 共415页
第6页 / 共415页
第7页 / 共415页
第8页 / 共415页
第9页 / 共415页
第10页 / 共415页
亲,该文档总共415页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Linux驱动驱动 开发发入门门与实战实战第1章 Linux驱动开发概述设备驱动程序是计算机硬件与应用程序的接口,是软件 系统与硬件系统沟通的桥梁。如果没有设备驱动程序,那么 硬件设备就只是一堆废铁,没有一点的功能。本章将对Linux 驱动开发进行简要的概述,使读者理解一些常见的概念。1.1 Linux设备驱动的基本概念本节对中断相关概念进行了简要的分析,并对中断进行 了分类。根据不同的中断类型,写中断驱动程序的方法也不 一样。下面将主要介绍中断的基本概念和常见分类。1.1.1 设备驱动程序概述 设备驱动程序(Device Driver),简称驱动程序(Driver)。 它是一个允许计算机软件(Computer Software)与硬件( Hardware)交互的程序。这种程序建立了一个硬件与硬件,或硬件 与软件沟通的界面。CPU经由主板上的总线(Bus)或其它沟通子 系统(Subsystem)与硬件形成连接,这样的连接使得硬件设备( Device)之间的数据交换成为可能。1.1.2 设备驱动程序的作用设备驱动程序是一种可以使计算机和设备通信的特殊程序 ,可以说相当于硬件的接口。操作系统只有通过这个接口,才 能控制硬件设备的工作。假如某设备的驱动程序未能正确安装 ,便不能正常工作。正因为这个原因,驱动程序在系统中的所 占的地位十分重要。一般当操作系统安装完毕后,首要的便是 安装硬件设备的驱动程序。1.1.3 设备驱动的分类计算机系统的主要硬件由CPU、存储器和外部设备组成。驱 动程序的对象一般是存储器和外部设备。随着芯片制造工艺的提 高,为了节约成本,通常将很多原属于外部设备的控制器嵌入到 CPU内部。所以现在驱动程序应该支持CPU中的嵌入控制器。 Linux将这些设备分为3大类:字符设备、块设备、网络设备。1.2 Linux操作系统与驱动的关系Linux操作系统与设备驱动之间的关系如图所示。用户 空间包括应用程序和系统调用两层。应用程序一般依赖于函 数库,而函数库是由系统调用来编写的,所以应用程序间接 地依赖于系统调用。1.3 Linux驱动程序开发Linux驱动程序的开发与应用程序的开发有很大的差别。 这些差别导致了编写Linux设备驱动程序与编写应用程序有本 质的区别,所以对于应用程序的设计技巧很难直接应用在驱动 程序的开发上。本节将对Linux驱动程序的开发进行简要的讲 解。1.3.1 用户态和内核态Linux操作系统分为用户态和内核态。用户态处理上层的 软件工作。内核态用来管理用户态的程序,完成用户态请求的 工作。驱动程序与底层的硬件交互,所以工作在内核态。1.3.2 模块机制模块是可以在运行时加入内核的代码,这是Linux的一个 很好的特性。这个特性使内核可以很容易的扩大或者缩小,一 方面扩大内核可以增加内核的功能,另一方面缩小内核可以减 小内核的大小。1.3.3 编写设备驱动程序需要了解的知识Linux操作系统有三四百万行代码,其中驱动程序代码就有四 分之三左右。所以对于驱动开发者来说,学习和编写设备驱动程序 都是一个漫长的过程。在这个过程中,读者应该掌握如下的一些知 识: (1)驱动开发人员应该有良好的C语言基础。 (2)驱动开发人员应该有良好的硬件基础。 (3)驱动开发人员应该对Linux内核源代码有初步的了解。 (4)驱动开发人员应该有多任务程序设计的能力。1.4 编写设备驱动程序的注意事项大部分程序员都比较熟悉应用程序的编写,但是对于驱 动程序的编写可能不是很熟悉。关于应用程序的很多编程经 验不能直接的应用于驱动程序的编写中来。下面给出编写驱 动程序的一些注意事项,希望引起读者注意。1.4.1 应用程序开发与驱动程序开发的差异在Linux上的程序开发一般分为两种,一种是内核及驱 动程序开发,另一种是应用程序开发。这两种开发种类对应 Linux的两种状态,分别是内核态和用户态。内核态用来管 理用户态的程序,完成用户态请求的工作;用户态处理上层 的软件工作。驱动程序与底层的硬件交互,所以工作在内核 态。1.4.2 GUN C开发驱动程序GUN C语言最开始起源于一个GUN计划,GUN的意思是 “GUN is not UNIX”。GUN计划开始于1984年,这个计划的目的 是开发一个类似UNIX并且软件自由的完整操作系统。这个计划 一直进行,直到Linus开发Linux操作系统时,GNU计划已经开 发出来了很多高质量的自由软件。其中就包括著名的GCC编译 器,GCC编译器能够编译GUN C语言。Linus考虑到GUN计划 的自由和免费,所以选择了GCC编译器来编写内核代码,之后 的很多开发者也使用这个编译器,所以直到现在,驱动开发人员 也使用GUN C语言来开放驱动程序。1.4.3 不能使用C库来开发驱动程序与用户空间的应用程序不同,内核不能调用标准的C函 数库,主要的原因在于对于内核来说完整的C库太大了。一 个编译的内核大小可以是1M左右的字节,而一个标准的C语 言库大小可能操作5M字节。这对于存储容量较小的嵌入式 设备来说,是不实用的。缺少标志C语言库,并不是说驱动 程序就只能做很好的事情了。1.4.4 没有内存保护机制当一个用户应用程序由于编程错误,试图访问一个非法的内 存空间,那么操作系统内核会结束这个进程,并返回错误码。应 用程序可以在操作系统内核的帮助下,恢复过来,而且应用程序 并不会对操作系统内核有太大的影响。但是如果当操作系统内核 访问了一个非法的内存,那么就有可能苹的诤说拇 或者数据。 这将导致内核处于未知的状态,内核会通过oops错误给用户一些 提示,但是这些提示都是不支持,难以分析的。1.4.5 小内核栈用户空间的程序可以从栈上分配大量的空间来存放变量 ,甚至用栈存放巨大的数据结构或者数组都没问题。之所以 能这样做是因为应用程序是非常驻内存的,它们可以动态的 申请和释放所有可用的内存空间。内核要求使用固定常驻的 内存空间,因此要求尽量少的占用常驻内存,而尽量多的留 出内存提供给用户程序使用。因此内核栈的长度是固定大小 的,不可动态增长的32位机的内核栈是8KB;64位机的内核 栈是16KB。1.4.6 重视可移植性对于用户空间的应用程序来说,可移植性一直是一个重 要的问题。一般可移植性通过两种方式来实现。一种方式是 定义一套可移植的API,然后对这套API在个这两个需要移 植的平台上分别实现。应用程序开发人员,只要使用这套可 移植的API,就可以写出可移植的程序。在嵌入式领域,比 较常见的API套件是QT。另一种方式是使用类似JAVA、 actionscript等可移植到很多操作系统上的语言。这些语言一 般通过虚拟机来执行,所以可以移植到很多平台上。1.5 Linux驱动的发展趋势随着嵌入式技术的发展,使用Linux的嵌入式设备也越来 越多。同样地,工业上对Linux驱动的开发也越来越重视。本 节对Linux驱动的发展做简要的介绍。1.5.1 Linux驱动的发展Linux和嵌入式Linux软件在过去几年里已经越来越普 遍的为IT业、半导体公司、嵌入式系统所认可和接受,它已 经成为一个可以替代微软的Windows和众多传统的RTOS的 重要的操作系统。Linux内核和基本组件和工具已经是成熟 的软件,面向行业,应用和设备的嵌入式Linux工具软件和 嵌入式Linux操作系统平台是未来发展的必然趋势。符合标 准,遵循开放是大势所趋,人心所向,嵌入式Linux也不例 外。1.5.2 驱动的应用计算机系统已经融入到了各行各业、各个领域;计算机系 统在电子产品中无处不在,从手机、游戏机、冰箱、电视、洗 衣机等小型设备,到汽车、轮船、火车、飞机等大型设备都有 它的身影。这些设备都需要驱动程序来使之运行,可以说驱动 程序的运用前景是非常广泛的。每一天都有很多驱动程序需要 去编写,所以驱动程序开发人员的前途是无比光明的。1.5.3 相关学习资源学习Linux设备驱动程序,单单只是学习理论是不够的, 还需要自动动手来写各种设备的驱动程序。写驱动程序不仅需 要读者的软件知识,还需要读者的硬件知识。在这里,推荐一 些国内外优秀的驱动开发网站,希望读者的学习有所帮助。 (1)Linux内核之旅网站:http:/www.kerneltravel.net/ (2)知名博客:http:/www.lupaworld.com/26540 (3)Linux中国:http:/www.linux-cn.com/ (4)一个不错的Linux中文社区:http:/www.linux- cn.com/ (5)csdn内核驱动研究社区: http:/topic.csdn.net/s/Linux_Dirver/0.html (6)Linux伊甸园:http:/bbs.linuxeden.com/index.php1.6 小结本章首先对Linux设备驱动程序的基本概念进行了详细 的讲述;并且讲述了设备驱动程序的作用;接着讲述了设备 驱动程序的分类、特点、与操作系统之间的关系等;然后讲 述了驱动程序开发的一些重要知识和一些注意事项。最后讲 述了Linux驱动程序的发展趋势。通过本章的学校,读者可 以对Linux设备驱动程序的开发有一个概要的了解。随着嵌入式设备的迅猛出现,有越来越多的驱动程序需 要程序员去编写,所以学习驱动程序的开发对个人的进步是 非常有帮助的。本章作为驱动程序开发的入门,希望能够引 起读者的学习兴趣。第2章 嵌入式处理器和开发板简介在实际的工程项目中,Linux驱动程序一般是为嵌入式系 统而写的。因为嵌入式系统因用途、功能、设计厂商不同, 硬件之间存在很多的差异。这些差异性,不能通过写一个通 用的驱动程序来完成,需要针对不同的设备书写不同的驱动 程序。要写驱动程序,必须了解处理器和开发板的相关信息 ,本章将对这些信息进行详解讲解。2.1 处理器的选择本节对处理器的概念进行了简要的讲解,并介绍了一些 常用的处理器种类,以使读者对嵌入式系统的处理器有初 步的认识。2.1.1 处理器简述处理器是解释并执行指令的功能部件。每个处理器都有 一个独特的诸如mov、add或sub这样的操作命令集,这个 操作集被称为指令系统。在计算机诞生初期,设计者喜欢 将计算机称为机器,所以该指令系统有时也称作机器指令 系统。2.1.2 处理器的种类处理器作为一种高科技产品,其技术含量非常高,目前全世界 只有少数厂商能够设计。这些厂商主要有Intel、AMD、ARM、中 国威盛、Cyrix、IBM和龙芯等。目前,处理器在嵌入式领域应用 十分广泛,各大厂商都推出了自己的嵌入式处理器,主要的嵌入 式处理器有:英特尔的PXA系列处理器、StrongARM 系列处理器 、MIPS处理器、摩托罗拉龙珠 (DragonBall)系列处理器、日立 SH3处理器和德州仪器OMAP系列处理器。了解这些嵌入式处理 器的特性,是驱动开发人员必须补的一课,所以本节对这些常用 的处理器进行简要的介绍。 1英特尔的PXA系列处理器 2StrongARM 系列处理器 3MIPS处理器 4摩托罗拉龙珠 (DragonBall) 系列处理器 5日立SH3处理器 6德州仪器OMAP系列处理器2.2 ARM处理器ARM处理器价格便宜,功能相对较多,是目前最为流 行的嵌入式处理器之一。ARM处理器分为很多种类,适 用于不同的应用。本节对其进行详细介绍。2.2.1 ARM处理器简介ARM处理器是目前最为流行的处理器之一,下面对该 处理器的一些常识进行介绍。 1ARM处理器 2ARM处理器的特点2.2.2 ARM处理器系列ARM处理器当前有6个产品系列:ARM7、ARM9、ARM9E 、ARM10、ARM11 和SecurCore,其中ARM11为最近推出的 产品。进一步产品来自于合作伙伴,例如Intel Xscale 微体系结 构和StrongARM 产品。ARM7、ARM9、ARM9E、ARM10是 4个通用处理器系列。每个系列提供一套特定的
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号