没有合适的资源?快使用搜索试试~ 我知道了~
linux设备驱动中文版word版
4星 · 超过85%的资源 需积分: 9 6 下载量 89 浏览量
2011-08-22
14:43:38
上传
评论
收藏 220KB DOC 举报
温馨提示
试读
25页
linux设备驱动开发研究,国外经典教材,对于linux设备驱动初学者很有益
资源推荐
资源详情
资源评论
第 1 章 第一章 设备驱动简介
目录 驱动程序的角色
划分内核
可加载模块
设备和模块的分类
安全问题
版本编号
版权条款
加入内核开发社团
本书的内容
以为代表的自由操作系统的很多优点之一是它们的内部是开放给所有人看的操
作系统曾经是一个隐藏的神秘的地方它的代码只局限于少数的程序员现在已准备好让任何具
备必要技能的人来检查理解以及修改已经帮助使操作系统民主化内核保留有大量
的复杂的代码但是那些想要成为内核的人需要一个入口点这样他们可以进入代码中
不会被代码的复杂性压倒通常设备驱动提供了这样的门路
驱动程序在内核里扮演着特殊的角色它们是截然不同的黑盒子使硬件的特殊的一
部分响应定义好的内部编程接口它们完全隐藏了设备工作的细节用户的活动通过一套标准化
的调用来进行这些调用与特别的驱动是独立的设备驱动的角色就是将这些调用映射到作用于
实际硬件的和设备相关的操作上这个编程接口是这样驱动可以与内核的其他部分分开建立并
在需要的时候在运行时插入这种模块化使得驱动易写以致于目前有几百个驱动可用
编写设备驱动有许多理由让人感兴趣可用的新硬件出现的速率以及陈旧的速率就
确保了驱动编写者在可见的将来内是忙碌的个别人可能需要了解驱动以便存取一个他们感兴趣
的特殊设备硬件供应商通过为他们的产品开发驱动可以给他们的潜在市场增加大量的
正在扩张的用户基数还有系统的开放源码性质意味着如果驱动编写者愿意 驱动源
码能够快速地散布到几百万用户
本书指导你如何编写你自己的驱动以及如何利用内核相关的部分我们采用一种设备独
立的方法编程技术和接口在任何可能的时候不会捆绑到任何特定的设备每一个驱动都是不
同的作为一个驱动编写者你需要深入理解你的特定设备但是大部分的原则和基本技术对所有
驱动都是一样的本书无法教你关于你的设备的东西但是它给予你所需要的使你的设备运行起
来的背景知识
在你学习编写驱动时你通常会发现大量有关内核的东西这也许会帮助你理解你的
机器是如何工作的以及为什么事情不是如你所愿的快或者不是如你所要的进行我们会逐步介
绍新概念由非常简单的驱动开始并建立它们每一个新概念都伴有例子代码这样的代码不需要
特别的硬件来测试本章不会真正进入编写代码但是我们介绍一些内核的背景概念这样
在以后我们动手编程时你会感到乐于知道这些
1.1. 驱动程序的角色
作为一个程序员你能够对你的驱动作出你自己的选择并且在所需的编程时间和结果的灵
活性之间选择一个可接受的平衡尽管说一个驱动是灵活的听起来有些奇怪但是我们喜欢
这个字眼因为它强调了一个驱动程序的角色是提供机制而不是策略
机制和策略的区分是其中一个在设计背后的最好观念大部分的编程问题其实可以划
分为 部分提供什么能力机制和如何使用这些能力策略如果这两方面由程序的不同部
分来表达或者甚至由不同的程序共同表达软件包是非常容易开发和适应特殊的需求
例如图形显示的管理划分为服务器它理解硬件以及提供了统一的接口给用户程序
还有窗口和会话管理器它实现了一个特别的策略而对硬件一无所知人们可以在不同的硬件上
使用相同的窗口管理器而且不同的用户可以在同一台工作站上运行不同的配置甚至完全不同
的桌面环境例如 !和"#$%!可以在同一系统中共存另一个例子是&'()*(网络的分层结构
操作系统提供+,-抽象层它对要传送的数据而言不实现策略而不同的服务器负责各种服务
以及它们的相关策略而且一个服务器例如./0提供文件传输机制同时用户可以使用任何他
们喜欢的客户端无论命令行还是图形客户端都存在并且任何人都能编写一个新的用户接口来
传输文件
在驱动相关的地方机制和策略之间的同样的区分都适用软驱驱动是不含策略的它的角
色仅仅是将磁盘表现为一个数据块的连续阵列系统的更高级部分提供了策略例如谁可以存取
软驱驱动这个软驱是直接存取还是要通过一个文件系统以及用户是否可以加载文件系统到这
个软驱因为不同的环境常常需要不同的使用硬件的方式尽可能对策略透明是非常重要的
在编写驱动时程序员应当特别注意这个基础的概念编写内核代码来存取硬件但是不能强
加特别的策略给用户因为不同的用户有不同的需求驱动应当做到使硬件可用将所有关于如何
使用硬件的事情留给应用程序一个驱动这样就是灵活的如果它提供了对硬件能力的存取没
有增加约束然而有时必须作出一些策略的决定例如一个数字*)$驱动也许只提供对硬件的
字符存取以便避免额外的代码处理单个位
你也可以从不同的角度看你的驱动它是一个存在于应用程序和实际设备间的软件层驱动
的这种特权的角色允许驱动程序员严密地选择设备应该如何表现不同的驱动可以提供不同的能
力甚至是同一个设备实际的驱动设计应当是在许多不同考虑中的平衡例如一个单个设备可
能由不同的程序并发使用驱动程序员有完全的自由来决定如何处理并发性你能在设备上实现
内存映射而不依赖它的硬件能力或者你能提供一个用户库来帮助应用程序员在可用的原语之上
实现新策略等等一个主要的考虑是在展现给用户尽可能多的选项和你不得不花费的编写驱动
的时间之间做出平衡还有需要保持事情简单以避免错误潜入
对策略透明的驱动有一些典型的特征这些包括支持同步和异步操作可以多次打开的能力
利用硬件全部能力没有软件层来简化事情或者提供策略相关的操作这样的驱动不但对他们
的最终用户好用而且证明也是易写易维护的成为策略透明的实际是一个共同的目标对软件设
计者来说
许多设备驱动确实是与用户程序一起发行的以便帮助配置和存取目标设备这些程序包
括简单的工具到完全的图形应用例子包括-1/程序它调整并口打印机驱动如何操作还有图
形的 0-1工具它是('%'*2驱动包的一部分经常会提供一个客户库它提供了不需要驱动自
身实现的功能
本书的范围是内核因此我们尽力不涉及策略问题应用程序以及支持库有时我们谈论不
同的策略以及如何支持他们但是我们不会进入太多有关使用设备的程序的细节或者是他们强
加的策略的细节但是你应当理解用户程序是一个软件包的构成部分并且就算是对策略透明
的软件包在发行时也会带有配置文件来对底层的机制应用缺省的动作
1.2. 划分内核
在系统中几个并发的进程专注于不同的任务每个进程请求系统资源象计算能力内
存网络连接或者一些别的资源内核是个大块的可执行文件负责处理所有这样的请求尽管不
同内核任务间的区别常常不是能清楚划分内核的角色可以划分如同图内核的划分成下列几个
部分
进程管理
内核负责创建和销毁进程并处理它们与外部世界的联系输入和输出不同进程间通讯通
过信号管道或者进程间通讯原语对整个系统功能来说是基本的也由内核处理另外调度器
控制进程如何共享'(是进程管理的一部分更通常地内核的进程管理活动实现了多个进程在
一个单个或者几个'(之上的抽象
内存管理
计算机的内存是主要的资源处理它所用的策略对系统性能是至关重要的内核为所有进程
的每一个都在有限的可用资源上建立了一个虚拟地址空间内核的不同部分与内存管理子系统通
过一套函数调用交互从简单的311,)4对到更多更复杂的功能
文件系统
在很大程度上基于文件系统的概念几乎中的任何东西都可看作一个文件内核在
非结构化的硬件之上建立了一个结构化的文件系统结果是文件的抽象非常多地在整个系统中应
用另外支持多个文件系统类型就是说物理介质上不同的数据组织方式例如磁盘可被
格式化成标准的-文件系统普遍使用的52&文件系统或者其他几个文件系统
设备控制
几乎每个系统操作最终都映射到一个物理设备上除了处理器内存和非常少的别的实体之
外全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行 这些代码称为设备
驱动内核中必须嵌入系统中出现的每个外设的驱动从硬盘驱动到键盘和磁带驱动器内核功能
的这个方面是本书中的我们主要感兴趣的地方
网络
网络必须由操作系统来管理因为大部分网络操作不是特定于某一个进程进入系统的报文
是异步事件报文在某一个进程接手之前必须被收集识别分发系统负责在程序和网络接口之
间递送数据报文它必须根据程序的网络活动来控制程序的执行另外所有的路由和地址解析问
题都在内核中实现
1.2.1. 可加载模块
的众多优良特性之一就是可以在运行时扩展由内核提供的特性的能力这意味着你可
以在系统正在运行着的时候增加内核的功能也可以去除每块可以在运行时添加到内核的代码
被称为一个模块内核提供了对许多模块类型的支持包括但不限于设备驱动每个模块由
目标代码组成没有连接成一个完整可执行文件可以动态连接到运行中的内核中通过+3,0
程序以及通过33,0程序去连接
图内核的划分表示了负责特定任务的不同类别的模块一个模块是根据它提供的功能来说它属
于一个特别类别的图内核的划分中模块的安排涵盖了最重要的类别但是远未完整因为在
中越来越多的功能被模块化了
图 1.1. 内核的划分
1.3. 设备和模块的分类
以的方式看待设备可区分为种基本设备类型每个模块常常实现种类型中的种
因此可分类成字符模块块模块或者一个网络模块这种将模块分成不同类型或类别的方法并非
是固定不变的程序员可以选择建立在一个大块代码中实现了不同驱动的巨大模块但是好的程
序员常常创建一个不同的模块给每个它们实现的新功能因为分解是可伸缩性和可扩张性的关
键因素类驱动如下
既然不是一个面向流的设备一个网络接口就不象)06)78那么容易映射到文件系统的一
个结点上的提供对接口的存取的方式仍然是通过分配一个名子给它们例如-9但是这
个名子在文件系统中没有对应的入口内核与网络设备驱动间的通讯与字符和块设备驱动所用的
完全不同不用0和:-内核调用和报文传递相关的函数
字符设备
一个字符设备是一种可以当作一个字节流来存取的设备如同一个文件一个字符
驱动负责实现这种行为这样的驱动常常至少实现,/1,+0和:-系统调用文本控制
台)06),+,1和串口)06)78;9及其友是字符设备的例子因为它们很好地展现了流的抽象
字符设备通过文件系统结点来存取例如)06)78和)06)1/9在一个字符设备和一个普通文件
之间唯一有关的不同就是你经常可以在普通文件中移来移去但是大部分字符设备仅仅是数据
通道你只能顺序存取然而存在看起来象数据区的字符设备你可以在里面移来移去例如
43<==经常这样应用程序可以使用33/或者1+存取整个要求的图像
块设备
如同字符设备块设备通过位于)06目录的文件系统结点来存取一个块设备例如一个磁
盘应该是可以驻有一个文件系统的在大部分的系统一个块设备只能处理这样的*)$操作
传送一个或多个长度经常是字节或一个更大的的幂的数的整块相反允许应用
程序读写一个块设备象一个字符设备一样它允许一次传送任意数目的字节结果就是块和字
符设备的区别仅仅在内核在内部管理数据的方式上并且因此在内核)驱动的软件接口上不同如
同一个字符设备每个块设备都通过一个文件系统结点被存取的它们之间的区别对用户是透明
的块驱动和字符驱动相比与内核的接口完全不同
网络接口
任何网络事务都通过一个接口来进行就是说一个能够与其他主机交换数据的设备通常
一个接口是一个硬件设备但是它也可能是一个纯粹的软件设备比如环回接口一个网络接口负
责发送和接收数据报文在内核网络子系统的驱动下不必知道单个事务是如何映射到实际的被
发送的报文上的很多网络连接特别那些使用&'(的是面向流的但是网络设备却常常设计成
处理报文的发送和接收一个网络驱动对单个连接一无所知它只处理报文有其他的划分驱动模
块的方式与上面的设备类型是正交的通常某些类型的驱动与给定类型设备的其他层的内核支
持函数一起工作例如你可以说;>模块串口模块;';*模块等等每个 ;>设备由一个;>
模块驱动与;>子系统一起工作但是设备自身在系统中表现为一个字符设备比如一个;>
串口一个块设备一个;>内存读卡器或者一个网络设备一个;>以太网接口
另外的设备驱动类别近来已经添加到内核中 包括5?驱动和*$驱动以它们处理
;>和 ;';*驱动相同的方式内核开发者集合了类别范围内的特性并把它们输出给驱动实现者
以避免重复工作和=<因此简化和加强了编写类似驱动的过程
在设备驱动之外别的功能不论硬件和软件在内核中都是模块化的一个普通的例子是文件系
统.
一个文件系统类型决定了在块设备上信息是如何组织的以便能表示一棵目录与文件的树
这样的实体不是设备驱动因为没有明确的设备与信息摆放方式相联系文件系统类型却是一种
软件驱动因为它将低级数据结构映射为高级的数据结构文件系统决定一个文件名多长以及在
一个目录入口中存储每个文件的什么信息文件系统模块必须实现最低级的系统调用来存取目
录和文件通过映射文件名和路径以及其他信息例如存取模式到保存在数据块中的数据结构
这样的一个接口是完全与数据被传送来去磁盘或其他介质相互独立这个传送是由一个块设
备驱动完成的
如果你考虑一个系统是多么依赖下面的文件系统你会认识到这样的一个软件概念对
系统操作是至关重要的解码文件系统信息的能力处于内核层级中最低级并且是最重要的甚至
如果你为你的新' @$%编写块驱动如果你对上面的数据不能运行1+或者/就毫无用处
支持一个文件系统模块的概念其软件接口声明了不同操作可以在一个文件系统节点目录文
件和超级块上进行操作对一个程序员来说居然需要编写一个文件系统模块是非常不常见的因
为官方内核已经包含了大部分重要的文件系统类型的代码
1.4. 安全问题
安全是当今重要性不断增长的关注点我们将讨论安全相关的问题在它们在本书中出现时
有几个通用的概念却值得现在提一下系统中任何安全检查都由内核代码强加上去如果内核有
安全漏洞系统作为一个整体就有漏洞在官方的内核发布里只有一个有授权的用户可以加载模
块系统调用-A3,01检查调用进程是否是有权加载模块到内核里因此当运行一个官方内
核时只有超级用户BC或者一个成功获得特权的入侵者才可以利用特权代码的能力在可能时
驱动编写者应当避免将安全策略编到他们的代码中安全是一个策略问题最好在内核高层来处
理在系统管理员的控制下但是常有例外作为一个设备驱动编写者你应当知道在什么情形下
剩余24页未读,继续阅读
资源评论
- wangjiefenglision2014-05-30word版好编辑,谢谢分享,好人一生平安。
- liu4174657782014-06-24内核版本是在是太老了,好像是2.4之前的了。
polyskin
- 粉丝: 4
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功