加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 linux设备驱动程序(中文第三版)+2.6内核

linux设备驱动程序(中文第三版)+2.6内核.pdf

linux设备驱动程序(中文第三版)+2.6内核

陌辞寒
2009-09-10 0人阅读 举报 0 0 暂无简介

简介:本文档为《linux设备驱动程序(中文第三版)+2.6内核pdf》,可适用于IT/计算机领域

Linux设备驱动EditionLinux设备驱动Edition下一页Linux设备驱动EditionByJonathanCorbet,AlessandroRubini,andGregKroahHartman由quickwhale翻译的简体中文版本V遵循原版的版权声明还在完善中欢迎任何意见,请给我邮件请发信至quickwhale的邮箱<quickwhalehotmailcom>版权©,,O’ReillyMedia,IncAllrightsreservedPrintedintheUnitedStatesofAmericaPublishedbyO’ReillyMedia,Inc,GravensteinHighwayNorth,Sebastopol,CAO’Reillybooksmaybepurchasedforeducational,business,orsalespromotionaluseOnlineeditionsarealsoavailableformosttitles(safarioreillycom)Formoreinformation,contactourcorporateinstitutionalsalesdepartment:()orcorporateoreillycomThisworkislicensedundertheCreativeCommonsAttributionNonCommercialShareAlikeLicenseToviewacopyofthislicense,visithttp:creativecommonsorglicensesbysaorsendalettertoCreativeCommons,NathanAbbottWay,Stanford,California,USA感谢感谢本书原版的作者JonathanCorbet,AlessandroRubini和GregKroahHartman感谢我的家人爸爸,妈妈,PIGYnuonuo目录第一章设备驱动简介驱动程序的角色划分内核可加载模块file:F|sea学习linux驱动编写Linux设备驱动Editionindexhtml(第/页)::Linux设备驱动Edition设备和模块的分类安全问题版本编号版权条款加入内核开发社团本书的内容建立和运行模块设置你的测试系统HelloWorld模块内核模块相比于应用程序用户空间和内核空间内核的并发当前进程几个别的细节编译和加载编译模块加载和卸载模块版本依赖平台依赖性内核符号表预备知识初始化和关停清理函数初始化中的错误处理模块加载竞争模块参数在用户空间做快速参考字符驱动scull的设计主次编号设备编号的内部表示分配和释放设备编号主编号的动态分配一些重要数据结构文件操作文件结构inode结构file:F|sea学习linux驱动编写Linux设备驱动Editionindexhtml(第/页)::Linux设备驱动Edition字符设备注册scull中的设备注册老方法open和releaseopen方法release方法scull的内存使用读和写read方法write方法readv和writev使用新设备快速参考调试技术内核中的调试支持用打印调试printk重定向控制台消息消息是如何记录的打开和关闭消息速率限制打印设备编号用查询来调试使用proc文件系统ioctl方法使用观察来调试调试系统故障oops消息系统挂起调试器和相关工具使用gdbkdb内核调试器kgdb补丁用户模式Linux移植Linux追踪工具动态探针并发和竞争情况scull中的缺陷file:F|sea学习linux驱动编写Linux设备驱动Editionindexhtml(第/页)::Linux设备驱动Edition并发和它的管理旗标和互斥体Linux旗标实现在scull中使用旗标读者写者旗标Completions机制自旋锁自旋锁API简介自旋锁和原子上下文自旋锁函数读者写者自旋锁锁陷阱模糊的规则加锁顺序规则细粗粒度加锁加锁的各种选择不加锁算法原子变量位操作seqlock锁读取拷贝更新快速参考高级字符驱动操作ioctl接口选择ioctl命令返回值预定义的命令使用ioctl参数兼容性和受限操作ioctl命令的实现不用ioctl的设备控制阻塞IO睡眠的介绍简单睡眠阻塞和非阻塞操作一个阻塞IO的例子高级睡眠测试scullpipe驱动file:F|sea学习linux驱动编写Linux设备驱动Editionindexhtml(第/页)::Linux设备驱动Editionpoll和select与read和write的交互底层的数据结构异步通知驱动的观点移位一个设备llseek实现在一个设备文件上的存取控制单open设备一次对一个用户限制存取阻塞open作为对EBUSY的替代在open时复制设备快速参考时间,延时,和延后工作测量时间流失使用jiffies计数器处理器特定的寄存器获知当前时间延后执行长延时短延时内核定时器定时器API内核定时器的实现Tasklets机制工作队列共享队列快速参考时间管理延迟内核定时器Tasklets机制工作队列分配内存kmalloc的真实故事flags参数size参数后备缓存file:F|sea学习linux驱动编写Linux设备驱动Editionindexhtml(第/页)::Linux设备驱动Edition一个基于Slab缓存的scull:scullc内存池getfreepage和其友一个使用整页的scull:scullpallocpages接口vmalloc和其友一个使用虚拟地址的scull:scullv每CPU的变量获得大量缓冲在启动时获得专用的缓冲快速参考与硬件通讯IO端口和IO内存IO寄存器和常规内存使用IO端口IO端口分配操作IO端口从用户空间的IO存取字串操作暂停IO平台依赖性一个IO端口例子并口纵览一个例子驱动使用IO内存IO内存分配和映射存取IO内存作为IO内存的端口重用short为IO内存在MB之下的ISA内存isareadb和其友快速参考中断处理准备并口安装一个中断处理proc接口自动检测IRQ号快速和慢速处理file:F|sea学习linux驱动编写Linux设备驱动Editionindexhtml(第/页)::Linux设备驱动Edition实现一个处理处理者的参数和返回值使能和禁止中断前和后半部Tasklet实现工作队列中断共享安装一个共享的处理者运行处理者proc接口和共享中断中断驱动IO一个写缓存例子快速参考内核中的数据类型标准C类型的使用安排一个明确大小给数据项接口特定的类型其他移植性问题时间间隔页大小字节序数据对齐指针和错误值链表快速参考下一页第章第一章设备驱动简介file:F|sea学习linux驱动编写Linux设备驱动Editionindexhtml(第/页)::第章第一章设备驱动简介第章第一章设备驱动简介上一页下一页第章第一章设备驱动简介目录驱动程序的角色划分内核可加载模块设备和模块的分类安全问题版本编号版权条款加入内核开发社团本书的内容以Linux为代表的自由操作系统的很多优点之一,是它们的内部是开放给所有人看的操作系统,曾经是一个隐藏的神秘的地方,它的代码只局限于少数的程序员,现在已准备好让任何具备必要技能的人来检查,理解以及修改Linux已经帮助使操作系统民主化Linux内核保留有大量的复杂的代码,但是,那些想要成为内核hacker的人需要一个入口点,这样他们可以进入代码中,不会被代码的复杂性压倒通常,设备驱动提供了这样的门路驱动程序在Linux内核里扮演着特殊的角色它们是截然不同的"黑盒子",使硬件的特殊的一部分响应定义好的内部编程接口它们完全隐藏了设备工作的细节用户的活动通过一套标准化的调用来进行,这些调用与特别的驱动是独立的设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上这个编程接口是这样,驱动可以与内核的其他部分分开建立,并在需要的时候在运行时"插入"这种模块化使得Linux驱动易写,以致于目前有几百个驱动可用编写Linux设备驱动有许多理由让人感兴趣可用的新硬件出现的速率(以及陈旧的速率)就确保了驱动编写者在可见的将来内是忙碌的个别人可能需要了解驱动以便存取一个他们感兴趣的特殊设备硬件供应商,通过为他们的产品开发Linux驱动,可以给他们的潜在市场增加大量的正在扩张的Linux用户基数还有Linux系统的开放源码性质意味着如果驱动编写者愿意,驱动源码能够快速地散布到几百万用户本书指导你如何编写你自己的驱动,以及如何利用内核相关的部分我们采用一种设备独立的方法编程技术和接口,在任何可能的时候,不会捆绑到任何特定的设备每一个驱动都是不同的作为一个驱动编写者,你需要深入理解你的特定设备但是大部分的原则和基本技术对所有驱动都是一样的本书无法教你关于你的设备的东西,但是它给予你所需要的使你的设备运行起来的背景知识file:F|sea学习linux驱动编写Linux设备驱动Editionchhtml(第/页)::第章第一章设备驱动简介的指导在你学习编写驱动时,你通常会发现大量有关Linux内核的东西这也许会帮助你理解你的机器是如何工作的,以及为什么事情不是如你所愿的快,或者不是如你所要的进行我们会逐步介绍新概念,由非常简单的驱动开始并建立它们每一个新概念都伴有例子代码,这样的代码不需要特别的硬件来测试本章不会真正进入编写代码但是,我们介绍一些Linux内核的背景概念,这样在以后我们动手编程时,你会感到乐于知道这些驱动程序的角色作为一个程序员,你能够对你的驱动作出你自己的选择,并且在所需的编程时间和结果的灵活性之间,选择一个可接受的平衡尽管说一个驱动是"灵活"的,听起来有些奇怪,但是我们喜欢这个字眼,因为它强调了一个驱动程序的角色是提供机制,而不是策略机制和策略的区分是其中一个在Unix设计背后的最好观念大部分的编程问题其实可以划分为部分:"提供什么能力"(机制)和"如何使用这些能力"(策略)如果这两方面由程序的不同部分来表达,或者甚至由不同的程序共同表达,软件包是非常容易开发和适应特殊的需求例如,图形显示的Unix管理划分为X服务器,它理解硬件以及提供了统一的接口给用户程序,还有窗口和会话管理器,它实现了一个特别的策略,而对硬件一无所知人们可以在不同的硬件上使用相同的窗口管理器,而且不同的用户可以在同一台工作站上运行不同的配置甚至完全不同的桌面环境,例如KDE和GNOME,可以在同一系统中共存另一个例子是TCPIP网络的分层结构:操作系统提供socket抽象层,它对要传送的数据而言不实现策略,而不同的服务器负责各种服务(以及它们的相关策略)而且,一个服务器,例如ftpd提供文件传输机制,同时用户可以使用任何他们喜欢的客户端无论命令行还是图形客户端都存在,并且任何人都能编写一个新的用户接口来传输文件在驱动相关的地方,机制和策略之间的同样的区分都适用软驱驱动是不含策略的它的角色仅仅是将磁盘表现为一个数据块的连续阵列系统的更高级部分提供了策略,例如谁可以存取软驱驱动,这个软驱是直接存取还是要通过一个文件系统,以及用户是否可以加载文件系统到这个软驱因为不同的环境常常需要不同的使用硬件的方式,尽可能对策略透明是非常重要的在编写驱动时,程序员应当特别注意这个基础的概念:编写内核代码来存取硬件,但是不能强加特别的策略给用户,因为不同的用户有不同的需求驱动应当做到使硬件可用,将所有关于如何使用硬件的事情留给应用程序一个驱动,这样,就是灵活的,如果它提供了对硬件能力的存取,没有增加约束然而,有时必须作出一些策略的决定例如,一个数字IO驱动也许只提供对硬件的字符存取,以便避免额外的代码处理单个位你也可以从不同的角度看你的驱动:它是一个存在于应用程序和实际设备间的软件层驱动的这种file:F|sea学习linux驱动编写Linux设备驱动Editionchhtml(第/页)::第章第一章设备驱动简介特权的角色允许驱动程序员y严密地选择设备应该如何表现:不同的驱动可以提供不同的能力,甚至是同一个设备实际的驱动设计应当是在许多不同考虑中的平衡例如,一个单个设备可能由不同的程序并发使用,驱动程序员有完全的自由来决定如何处理并发性你能在设备上实现内存映射而不依赖它的硬件能力,或者你能提供一个用户库来帮助应用程序员在可用的原语之上实现新策略,等等一个主要的考虑是在展现给用户尽可能多的选项,和你不得不花费的编写驱动的时间之间做出平衡,还有需要保持事情简单以避免错误潜入对策略透明的驱动有一些典型的特征这些包括支持同步和异步操作,可以多次打开的能力,利用硬件全部能力,没有软件层来"简化事情"或者提供策略相关的操作这样的驱动不但对他们的最终用户好用,而且证明也是易写易维护的成为策略透明的实际是一个共同的目标,对软件设计者来说许多设备驱动,确实,是与用户程序一起发行的,以便帮助配置和存取目标设备这些程序包括简单的工具到完全的图形应用例子包括tunelp程序,它调整并口打印机驱动如何操作,还有图形的cardctl工具,它是PCMCIA驱动包的一部分经常会提供一个客户库,它提供了不需要驱动自身实现的功能本书的范围是内核,因此我们尽力不涉及策略问题,应用程序,以及支持库有时我们谈论不同的策略以及如何支持他们,但是我们不会进入太多有关使用设备的程序的细节,或者是他们强加的策略的细节但是,你应当理解,用户程序是一个软件包的构成部分,并且就算是对策略透明的软件包在发行时也会带有配置文件,来对底层的机制应用缺省的动作上一页下一页Linux设备驱动Edition起始页划分内核file:F|sea学习linux驱动编写Linux设备驱动Editionchhtml(第/页)::划分内核划分内核上一页第章第一章设备驱动简介下一页划分内核在Unix系统中,几个并发的进程专注于不同的任务每个进程请求系统资源,象计算能力,内存,网络连接,或者一些别的资源内核是个大块的可执行文件,负责处理所有这样的请求尽管不同内核任务间的区别常常不是能清楚划分,内核的角色可以划分(如同图内核的划分)成下列几个部分:进程管理内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出)不同进程间通讯(通过信号,管道,或者进程间通讯原语)对整个系统功能来说是基本的,也由内核处理另外,调度器,控制进程如何共享CPU,是进程管理的一部分更通常地,内核的进程管理活动实现了多个进程在一个单个或者几个CPU之上的抽象内存管理计算机的内存是主要的资源,处理它所用的策略对系统性能是至关重要的内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间内核的不同部分与内存管理子系统通过一套函数调用交互,从简单的mallocfree对到更多更复杂的功能文件系统Unix在很大程度上基于文件系统的概念几乎Unix中的任何东西都可看作一个文件内核在非结构化的硬件之上建立了一个结构化的文件系统,结果是文件的抽象非常多地在整个系统中应用另外,Linux支持多个文件系统类型,就是说,物理介质上不同的数据组织方式例如,磁盘可被格式化成标准Linux的ext文件系统,普遍使用的FAT文件系统,或者其他几个文件系统设备控制几乎每个系统操作最终都映射到一个物理设备上除了处理器,内存和非常少的别的实体之外,全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行这些代码称为设备驱动内核中必须嵌入系统中出现的每个外设的驱动,从硬盘驱动到键盘和磁带驱动器内核功能的这个方面是本书中的我们主要感兴趣的地方网络网络必须由操作系统来管理,因为大部分网络操作不是特定于某一个进程:进入系统的报文是异步事件报文在某一个进程接手之前必须被收集,识别,分发系统负责在程序和网络接口之间递送数据报文,它必须根据程序的网络活动来控制程序的执行另外,所有的路由和地址解析问题都在内核中实现file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::划分内核可加载模块Linux的众多优良特性之一就是可以在运行时扩展由内核提供的特性的能力这意味着你可以在系统正在运行着的时候增加内核的功能(也可以去除)每块可以在运行时添加到内核的代码,被称为一个模块Linux内核提供了对许多模块类型的支持,包括但不限于,设备驱动每个模块由目标代码组成(没有连接成一个完整可执行文件),可以动态连接到运行中的内核中,通过insmod程序,以及通过rmmod程序去连接图内核的划分表示了负责特定任务的不同类别的模块,一个模块是根据它提供的功能来说它属于一个特别类别的图内核的划分中模块的安排涵盖了最重要的类别,但是远未完整,因为在Linux中越来越多的功能被模块化了图内核的划分file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::划分内核上一页上一级下一页第章第一章设备驱动简介起始页设备和模块的分类file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::设备和模块的分类设备和模块的分类上一页第章第一章设备驱动简介下一页设备和模块的分类以LInux的方式看待设备可区分为种基本设备类型每个模块常常实现种类型中的种,因此可分类成字符模块,块模块,或者一个网络模块这种将模块分成不同类型或类别的方法并非是固定不变的程序员可以选择建立在一个大块代码中实现了不同驱动的巨大模块但是,好的程序员,常常创建一个不同的模块给每个它们实现的新功能,因为分解是可伸缩性和可扩张性的关键因素类驱动如下:既然不是一个面向流的设备,一个网络接口就不象devtty那么容易映射到文件系统的一个结点上Unix的提供对接口的存取的方式仍然是通过分配一个名子给它们(例如eth),但是这个名子在文件系统中没有对应的入口内核与网络设备驱动间的通讯与字符和块设备驱动所用的完全不同不用read和write,内核调用和报文传递相关的函数字符设备一个字符(char)设备是一种可以当作一个字节流来存取的设备(如同一个文件)一个字符驱动负责实现这种行为这样的驱动常常至少实现open,close,read,和write系统调用文本控制台(devconsole)和串口(devttyS及其友)是字符设备的例子,因为它们很好地展现了流的抽象字符设备通过文件系统结点来存取,例如devtty和devlp在一个字符设备和一个普通文件之间唯一有关的不同就是,你经常可以在普通文件中移来移去,但是大部分字符设备仅仅是数据通道,你只能顺序存取然而,存在看起来象数据区的字符设备,你可以在里面移来移去例如,framegrabber经常这样,应用程序可以使用mmap或者lseek存取整个要求的图像块设备如同字符设备,块设备通过位于dev目录的文件系统结点来存取一个块设备(例如一个磁盘)应该是可以驻有一个文件系统的在大部分的Unix系统,一个块设备只能处理这样的IO操作,传送一个或多个长度经常是字节(或一个更大的的幂的数)的整块Linux,相反,允许应用程序读写一个块设备象一个字符设备一样它允许一次传送任意数目的字节结果就是,块和字符设备的区别仅仅在内核在内部管理数据的方式上,并且因此在内核驱动的软件接口上不同如同一个字符设备,每个块设备都通过一个文件系统结点被存取的,它们之间的区别对用户是透明的块驱动和字符驱动相比,与内核的接口完全不同网络接口任何网络事务都通过一个接口来进行,就是说,一个能够与其他主机交换数据的设备通常,一个接口是一个硬件设备,但是它也可能是一个纯粹的软件设备,比如环回接口一个网络接file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::设备和模块的分类口负责发送和接收数据报文,在内核网络子系统的驱动下,不必知道单个事务是如何映射到实际的被发送的报文上的很多网络连接(特别那些使用TCP的)是面向流的,但是网络设备却常常设计成处理报文的发送和接收一个网络驱动对单个连接一无所知它只处理报文有其他的划分驱动模块的方式,与上面的设备类型是正交的通常,某些类型的驱动与给定类型设备的其他层的内核支持函数一起工作例如,你可以说USB模块,串口模块,SCSI模块,等等每个USB设备由一个USB模块驱动,与USB子系统一起工作,但是设备自身在系统中表现为一个字符设备(比如一个USB串口),一个块设备(一个USB内存读卡器),或者一个网络设备(一个USB以太网接口)另外的设备驱动类别近来已经添加到内核中,包括FireWire驱动和IO驱动以它们处理USB和SCSI驱动相同的方式,内核开发者集合了类别范围内的特性,并把它们输出给驱动实现者,以避免重复工作和bug,因此简化和加强了编写类似驱动的过程在设备驱动之外,别的功能,不论硬件和软件,在内核中都是模块化的一个普通的例子是文件系统一个文件系统类型决定了在块设备上信息是如何组织的,以便能表示一棵目录与文件的树这样的实体不是设备驱动,因为没有明确的设备与信息摆放方式相联系文件系统类型却是一种软件驱动,因为它将低级数据结构映射为高级的数据结构文件系统决定一个文件名多长,以及在一个目录入口中存储每个文件的什么信息文件系统模块必须实现最低级的系统调用,来存取目录和文件,通过映射文件名和路径(以及其他信息,例如存取模式)到保存在数据块中的数据结构这样的一个接口是完全与数据被传送来去磁盘(或其他介质)相互独立,这个传送是由一个块设备驱动完成的如果你考虑一个Unix系统是多么依赖下面的文件系统,你会认识到这样的一个软件概念对系统操作是至关重要的解码文件系统信息的能力处于内核层级中最低级,并且是最重要的甚至如果你为你的新CDROM编写块驱动,如果你对上面的数据不能运行ls或者cp就毫无用处Linux支持一个文件系统模块的概念,其软件接口声明了不同操作,可以在一个文件系统节点,目录,文件和超级块上进行操作对一个程序员来说,居然需要编写一个文件系统模块是非常不常见的,因为官方内核已经包含了大部分重要的文件系统类型的代码上一页上一级下一页划分内核起始页安全问题file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::安全问题安全问题上一页第章第一章设备驱动简介下一页安全问题安全是当今重要性不断增长的关注点我们将讨论安全相关的问题,在它们在本书中出现时有几个通用的概念,却值得现在提一下系统中任何安全检查都由内核代码强加上去如果内核有安全漏洞,系统作为一个整体就有漏洞在官方的内核发布里,只有一个有授权的用户可以加载模块系统调用initmodule检查调用进程是否是有权加载模块到内核里因此,当运行一个官方内核时,只有超级用户或者一个成功获得特权的入侵者,才可以利用特权代码的能力在可能时,驱动编写者应当避免将安全策略编到他们的代码中安全是一个策略问题,最好在内核高层来处理,在系统管理员的控制下但是,常有例外作为一个设备驱动编写者,你应当知道在什么情形下,某些类型的设备存取可能反面地影响系统作为一个整体,并且应当提供足够地控制例如,会影响全局资源的设备操作(例如设置一条中断线),可能会损坏硬件(例如,加载固件),或者它可能会影响其他用户(例如设置一个磁带驱动的缺省的块大小),常常是只对有足够授权的用户,并且这种检查必须由驱动自身进行驱动编写者也必须要小心,当然,来避免引入安全bugC编程语言使得易于犯下几类的错误例如,许多现今的安全问题是由于缓冲区覆盖引起,它是由于程序员忘记检查有多少数据写入缓冲区,数据在缓冲区结尾之外结束,因此覆盖了无关的数据这样的错误可能会危及整个系统的安全,必须避免幸运的是,在设备驱动上下文中避免这样的错误经常是相对容易的,这里对用户的接口经过精细定义并被高度地控制一些其他的通用的安全观念也值得牢记任何从用户进程接收的输入应当以极大的怀疑态度来对待除非你能核实它,否则不要信任它小心对待未初始化的内存从内核获取的任何内存应当清零或者在其对用户进程或设备可用之前进行初始化否则,可能发生信息泄漏(数据,密码的暴露等等)如果你的设备解析发送给它的数据,要确保用户不能发送任何能危及系统的东西最后,考虑一下设备操作的可能后果如果有特定的操作(例如,加载一个适配卡的固件或者格式化一个磁盘),能影响到系统的,这些操作应该完全确定地要限制在授权的用户中也要小心,当从第三方接收软件时,特别是与内核有关:因为每个人都可以接触到源码,每个人都可以分拆和重组东西尽管你能够信任在你的发布中的预编译的内核,你应当避免运行一个由不能信任的朋友编译的内核如果你不能作为root运行预编译的二进制文件,那么你最好不要运行一个预编译的内核例如,一个经过了恶意修改的内核可能会允许任何人加载模块,这样就通过initmodule开启了一个不想要的后门file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::安全问题注意,Linux内核可以编译成不支持任何属于模块的东西,因此关闭了任何模块相关的安全漏洞在这种情况下,当然,所有需要的驱动必须直接建立到内核自身内部在和以后的内核,也可以在系统启动之后,通过capability机制来禁止内核模块的加载从技术上讲,只有具有CAPSYSMODULE权利的人才可以进行这个操作我们第章讨论capabilities上一页上一级下一页设备和模块的分类起始页版本编号file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::版本编号版本编号上一页第章第一章设备驱动简介下一页版本编号在深入编程之前,我们应当对Linux使用的版本编号方法和本书涉及的版本做些说明首先,注意的是在Linux系统中使用的每一个软件包有自己的发行版本号,它们之间存在相互依赖性:你需要一个包的特别的版本来运行另外一个包的特别版本Linux发布的创建者常常要处理匹配软件包的繁琐问题,这样用户从一个已打包好的发布中安装就不需要处理版本号的问题了另外,那些替换和更新系统软件的人,就要自己处理这个问题了幸运的是,几乎所有的现代发布支持单个软件包的更新,通过检查软件包之间的依赖性发布的软件包管理器通常不允许更新,直到满足了依赖性为了运行我们在讨论过程中介绍的例子,你除了内核要求的之外不需要任何工具的特别版本任何近期的Linux发布都可以用来运行我们的例子我们不详述特别的要求,因为你内核源码中的文件DocumentChanges是这种信息的最好的来源,如果你遇到任何问题至于说内核,偶数的内核版本(就是说,x)是稳定的,用来做通用的发布奇数版本(例如x),相反,是开发快照并且是非常短暂的它们的最新版本代表了开发的当前状态,但是会在几天内就过时了本书涵盖内核版本我们的目标是为设备驱动编写者展示内核的所有可用的特性,这是我们在编写本书时的内核版本本书的这一版不涉及内核的其他版本你们有人感兴趣的话,本书第版详细涵盖到版本那个版本依然在htt:lwnnetKernelLDD在线获取到内核程序员应当明白到内核的开发过程的改变系列现在接受之前可能认为对一个"稳定"的内核太大的更改在其他的方面,这意味着内核内部编程接口可能改变,因此潜在地会使本书某些部分过时基于这个原因,伴随着文本的例子代码已知可以在上运行,但是某些模块没有在之前的版本上编译想紧跟内核编程变化的程序员最好加入邮件列表,并且利用列在参考书目中的网站也有一个网页在http:lwnnetArticlskernelapi上维护,它包含自本书出版以来的API改变的信息本文不特别地谈论奇数内核版本普通用户不会有理由运行开发中的内核试验新特性的开发者,但是,想运行最新的开发版本他们常常不停更新到最新的版本,来收集bug的修正和新的特性实现但是注意,试验中的内核没有任何保障,如果你由于一个非当前的奇数版本内核的一个bug而引起的问题,没人可以帮你那些运行奇数版本内核的人常常是足够熟练的深入到代码中,不需要一本教科书,这也是我们为什么不谈论开发中的内核的另一个原因Linux的另一个特性是它是平台独立的操作系统,并非仅仅是"PC克隆体的一种Unix克隆",更多file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::版本编号的:它当前支持大约种体系本书是尽可能地平台独立,所有的代码例子至少是在x和x平台上测试过因为代码已经在bit和bit处理器上测试过,它应当能够在所有其他平台上编译和运行如同你可能期望地,依赖特殊硬件的代码例子不会在所有支持的平台上运行,但是这个通常在源码里说明了注意,对于偶数版本的内核也不存在保证,除非你依靠一个同意提供它自己的担保的商业供应商上一页上一级下一页安全问题起始页版权条款file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::版权条款版权条款上一页第章第一章设备驱动简介下一页版权条款Linux是以GNU通用公共版权(GPL)的版本作为许可的,它来自自由软件基金的GNU项目GPL允许任何人重发布,甚至是销售,GPL涵盖的产品,只要接收方对源码能存取并且能够行使同样的权力另外,任何源自使用GPL产品的软件产品,如果它是完全的重新发布,必须置于GPL之下发行这样一个许可的主要目的是允许知识的增长,通过同意每个人去任意修改程序同时,销售软件给公众的人仍然可以做他们的工作尽管这是一个简单的目标,关于GPL和它的使用存在着从未结束的讨论如果你想阅读这个许可证,你能够在你的系统中几个地方发现它,包括你的内核源码树的目录中的COPYING文件供应商常常询问他们是否可以只发布二进制形式的内核模块对这个问题的答案已是有意让它模糊不清二进制模块的发布只要它们依附预已公布的内核接口至今已是被接受了但是内核的版权由许多开发者持有,并且他们不是全都同意内核模块不是衍生产品如果你或者你的雇主想在非自由的许可下发布内核模块,你真正需要的是和你的法律顾问讨论请注意内核开发者不会对于在内核发行之间破坏二进制模块有任何疑虑,甚至在一个稳定的内核系列之间如果它根本上是可能的,你和你的用户最好以自由软件的方式发行你的模块如果你想你的代码进入主流内核,或者如果你的代码需要对内核的补丁,你在发行代码时,必须立刻使用一个GPL兼容的许可尽管个人使用你的改变不需要强加GPL,如果你发布你的代码,你必须包含你的代码到发布里面要求你的软件包的人必须被允许任意重建二进制的内容至于本书,大部分的代码是可自由地重新发布,要么是源码形式,要么是二进制形式,我们和O'Reilly都不保留任何权利对任何的衍生的工作所有的程序都可从ftp:ftporacompubexampleslinuxdrivers得到,详尽的版权条款在相同目录中的LICENSE文件里阐述上一页上一级下一页版本编号起始页加入内核开发社团file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml::加入内核开发社团加入内核开发社团上一页第章第一章设备驱动简介下一页加入内核开发社团在你开始为Linux内核编写模块时,你就成为一个开发者大社团的一部分在这个社团中,你不仅会发现有人忙碌于类似工作,还有一群特别投入的工程师努力使Linux成为更好的系统这些人可以是帮助,理念,以及关键的审查的来源,以及他们将是你愿意求助的第一类人,当你在寻找一个新驱动的测试者对于Linux内核开发者,中心的汇聚点是Linux内核邮件列表所有主要的内核开发者,从LinusTorvalds到其他人,都订阅这个列表请注意这个列表不适合心力衰弱的人:每天或者几天内的书写流量可能多至条消息但是,随这个列表之后的是对那些感兴趣于内核开发的人重要的东西它也是一个最高品质的资源,对那些需要内核开发帮助的人为加入Linux内核列表,遵照在Linux内核邮件列表FAQ:http:wwwtuxorglkml中的指示阅读这个FAQ的剩余部分,当你熟悉它时那里有大量的有用的信息Linux内核开发者都是忙碌的人,他们更多地愿意帮助那些已经清楚地首先完成了属于自己的那部分工作的人上一页上一级下一页版权条款起始页本书的内容file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml::本书的内容本书的内容上一页第章第一章设备驱动简介下一页本书的内容从这里开始,我们进入内核编程的世界第章介绍了模块化,解释了内部的秘密以及展示了运行模块的代码第章谈论字符驱动以及展示一个基于内存的设备驱动的代码,出于乐趣对它读写使用内存作为设备的硬件基础使得任何人可以不用要求特殊的硬件来运行代码调试技术对程序员是必备的工具,第章介绍它对那些想分析当前内核的人同样重要的是并发的管理和竞争情况第章关注的是由于并发存取资源而导致的问题,并且介绍控制并发的Linux机制在具备了调试和并发管理的能力下,我们转向字符驱动的高级特性,例如阻塞操作,selet的使用,以及重要的ioctl调用这是第章的主题在处理硬件管理之前,我们研究多一点内核软件接口:第章展示了内核中是如何管理时间的,第章讲解了内存分配接下来我们集中到硬件第章描述了IO口的管理和设备上的内存缓存随后是中断处理,在第章不幸的是,不是每个人都能运行这些章节中的例子代码,因为确实需要某些硬件来测试软件接口中断我们尽力保持需要的硬件支持到最小程度,但是你仍然需要某些硬件,例如标准并口,来使用这些章节的例子代码第章涉及内核数据类型的使用,以及编写可移植代码本书的第半专注于更高级的主题我们从深入硬件内部开始,特别的,是特殊外设总线功能第章涉及编写PCI设备驱动,第章检验使用USB设备的API具有了对外设总线的理解,我们详细看一下Linux设备模型,这是内核使用的抽象层来描述它管理的硬件和软件资源第章是一个自底向上的设备模型框架的考察,从kobject类型开始以及从那里进一步进行它涉及设备模型与真实设备的集成接下来是利用这些知识来接触如热插拔设备和电源管理等主题在第章,我们转移到Linux的内存管理这一章显示如何映射系统内存到用户空间(mmap系统调用),映射用户内存到内核空间(使用getuserpages),以及如何映射任何一种内存到设备空间(进行直接内存存取DMA操作)我们对内存的理解将对下面两章是有用的,它们涉及到其他主要的驱动类型第章介绍了块驱动,并展示了与我们到现在为止已遇到过的字符驱动的区别第章进入网络驱动的编写我们最file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页)::本书的内容后是讨论串行驱动(第章)和一个参考书目上一页上一级下一页加入内核开发社团起始页第章建立和运行模块file:F|sea学习linux驱动编写Linux设备驱动Editionchshtml(第/页):

用户评价(2)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/49

linux设备驱动程序(中文第三版)+2.6内核

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利