LinuxLDD 中文版 能帮助你很快进入驱动的世界www.linuxidc.comLINUX DEVICE DRIVERS, 3RD EDITION3.7.2. write方法3.7.3.rdhv初 writev.38.使用新设备39.快速参考56第4章调试技术…584.1.内核中的调试支持5842.用打印调试““4.2./. printk.……4.2.2.更定向控制台消息…4.2.3.消息是如何记录的4.2.4.打开和关消息4.2.5.速率限制4.2.6.打印设备编号6543.用查询来调试…664.3.1.用oc文件系统.664.3.2.ictl方法,44.使用观察来调试734.5.调试系统故障754.5.1.0Ops消息4.5.2.系统挂起7…46.调试器和相关工具4.6.,1.使用gdb.4.6.2Mh内核调试器46.3.kgb4.61.4.用户模式imx移n4.6.5.Lmux追具4.6.6.动态探针86第5章并发和竞争情况.………,875.1. SCULL中的缺陷52.并发和它的管理8853.旗标和互斥体.895.3.1. linux旗标实现5.3.2.在scul中使用放标915.3.3.读者写者旗标.9254. COMPLETIONS机制5.5.自旋锁955.5.1.自旋锁APⅠ筒个5.5.2.自旋锁和原厂上下文.965.5.3.自旋锁数∴975.54.读者写者自旋锁5.6.锁陷阱5.6.1.模糊的则..995.06.2.加锁饭序翅56.3.细-框粒度加锁005.7.加锁的各种选择…5.7.1.不加锁章法005.7.2,.原子交星10157.3.位粲作0357.4. seqlock锁.1045.7.5.读取接贝-新70558.快速参考·中···.106第6章高级字符驱动操作…6.1. IOCTL接口6.1.1.送择ict!命个126.1.2.返回值…1156.1.3.预定义的命令115Linuⅸx公社(Linuxdo.com)是包括Ubuntu,Fedora,SUSE技术,最新I资讯等Linux专业类网站www.linuxidc.comLINUX DEVICE DRIVERS, 3RD EDITION6.1.4.使用oct至数166.1.5.兼容性和受限荣作1186.1.6. ioctl命令的灾现..1196.1.7.不用ioc:的设备控制62.阻塞I1216.2.1.饭纸的介绍1226.2.2.简单1226.2.3.阻塞和∥阻塞操作1246.2.4.一个m寒I0的例子1256.2.5.高级题1276.2.6.测试cl1pie动1346.3.POLL和 SELECT1356.3.1.与read和wie的交互376.3.2.底层的数据结构3964.异步通知64..驱动的观点14l65.移位一个设备….142651.Ilek现4366.在一个设备文件上的存取控制…66.1.单open投备14466.2.一次对一个用户限制存次1466.3.塞open作为村EBSy的梦代6.6.4.在open的复制设备14867快速参考150第7章时间,延时,和延后工作7.1.测量时间流失7.1.1.使用e计数器1547.1.2.处理器特定的寄存器1567.2.获知当前时间…1587.3.延后执行7.3.1.长延的1607.3.2.短延的y)16474.内核定时器1657.4,1.定器APL7.4.2.内核定时器的实现1697.5. TASKLETS机制.…1707.6.工作队177.6.1.共亨列17477.快速参考1767.7.1.的管理..1767.7.2.近迟7.7.3.内核定时器l787.7.4. Tasklets视制.1787.7.5.作队列l79第8章分配内存l8181. KMALLOC的真实故事…1818.1.. flags参数.I88.1.2,.sie参数82.后备缓存8.2.1.一个基Slab线存的scwl2 scull.8.2.2.内存池8.3. GET FREE PAGE和其友…∴188.3.1.一个使用整页的CW:c1p7898.3.2.aloc_ pages接1908.3.3. vmalloc和其反1918.3.4.个使用虚拟地业的cwll: scully1193Linuⅸx公社(Linuxdo.com)是包括Ubuntu,Fedora,SUSE技术,最新I资讯等Linux专业类网站www.linuxidc.comLINUX DEVICE DRIVERS, 3RD EDITION84.每-CPU的变量85.获得大量缓冲….…1968.5.1.在启动的获得专闭的缓19686.快速参考第9章与硬件通讯…201.1.DO端∏和1O内存……2019.1.1.DO寄存器和常规内存.20292.使用IO端口2039.2.1.0端口分配2049.2.2.操作1O端1.20492.3.从户空问的10有取…2059.2.4.字操体9.2.5.暂停D0.2009.26.平台依额性20793.一个IO端口例子9.3.1.并口纵览2099.3.2.一个例子组动21094.使用IO内存2119.4.1.0内存分配和射.21294.2.存取内存2139.4.3.作为O内存的端1.…2l494.4.里用 short为0内存21594.5.在1MB之下的SA内存21594.6. isa reade和改反21795.快速参考217第10章中断处理.22010.1.准备并口22010.2.安装一个断处理22010.2.1.OCc孩112210.2.2.自动检测RQ号.22410.2.3.快速初速处理…10.2.4.实现一个处理…10.2.5.处型者的参数和返回值23210.2.6.使能和禁作中新10.3.前和后半部23410.3.1.7 ashlet实现10.3.2.工作队列.23610.4.中断共享23710.4.1.安装一个共的处埋者23710.4.2.运行处理者.23810.4.3.DOc接口列共中断23910.5.中断驱动IO23910.5.1.一个写缓存例子…10.6.快速参考243第11章内核中的数据类型24511.1.标准C类型的使用112.安排一个明确大小给数据项24611.3.接口特定的类型247114.其他移植性问题2481l.4,1.的间同114.2.页大小24811.4.3.字1144.数据齐……24911.4.5.指针和值…11.5.链表11.6.快速参考255Linuⅸx公社(Linuxdo.com)是包括Ubuntu,Fedora,SUSE技术,最新I资讯等Linux专业类网站www.linuxidc.comLINUX DEVICE DRIVERS, 3RD EDITION第12章PCI驱动25712.1.PCI接∏12.1.1.PCⅠ了址.25712.1.2.启动时问.26012.1.3.配置寄存器和初始化.26112. 4. MODULEDEVICETABLE Z.26412.1.5.江册一个PC动26412.1.6.老式PCI探测12.1.7.使能PC设备26712.1.8.取配置空间….26712.1.9.有取DO和内有空问26812.1.,10.PC1中…12.1.1.硬件象.270122.回顾:ISA27212.2,.1.硬件资源12.2.2.ISA编程12.2.3.即插即用规范123.PC/104和PC/104+273124.其他的PC总线2741241.MCA总线27412.4.2.ES总线2741243.WB总线12.5. SBUS…27512.6. NUBUS总线…12.7.外部总线12.8.快速参考第13章USB驱动.27813.1.USB设备基础知识13.1.1.端点27913.1.2.按11...28113.1.3.配置..28213.2.USB和 SYSFS28213.3.USB的URBS28413.3.1.结构 truct urb13.3.2.建和销毁urb29113.3.3.提交urb13.3.4.完成b:完成调的理者29413.3.5.取消wb.29534.编写一个USB驱动29513.4.1.动支持什么设备29513.4.2.注册一个USB驱动13.4.3.提交控制一个ub30313.5.无URB的USB传送13.51. usb bulk msg接1113.5.2. usb control msg A30013.5.3.用LSB数据函数.30713.6.快速参考308第14章LNUx设备模型31114.1. KOBJECTS, KSETS FH SUBSYSTEMS ............................31214..1. Kobject基31314,1,2. kobject层次ket,和子系统t310142.低级 SYSES操作31914.2.1.缺省属性..3l914.2.2.缺省属性.32114.2.3.二进制属性32l14.2.4.符号连接Linuⅸx公社(Linuxdo.com)是包括Ubuntu,Fedora,SUSE技术,最新I资讯等Linux专业类网站www.linuxidc.comLINUX DEVICE DRIVERS, 3RD EDITION14.3.热插拔事件产生32214.3.1.热插拔操作323144.总线,设备,和驱动32414.4.1.总线32414.4.2.设务32714.4.3.设备继动14.5.类““14.5.1. class simple接33414.5.2.完整的类接口3314.6.集成起来33714.6.1.添加一个设备…33814.6.2.去除一个设备34114.6.3.添加一个驱动34114.64.大除一个驱动34214.7.热插拔34214.7.1.动还设备14.7.2. bin/hotplug点14.7.3.使用 /sbin/hotplug347148.处理固件34914.8.1.内核固件接口14.8.2.它如何工作35014.9.快速参考…3514.9.1. Objects结35l14.9.2.syss操作35214.9.3.总线改备,和动35214.9.4.类35314.9.5.体354第15章内存映射和DMA15.1.LNUⅹ中的内存管理.35515.1.1.地址类型15.1.2.物理地班和页…15.1.3.高和纸存15.1.4.内存射和 struct page,……35815.1.5.页表36015.1.0.虚我内存区36015.1.7.进程内存班射2.MMAP设备操作15.2,1.使用 remap pfn range36515.2,2.一个简单的实现152.3.添加VM1的架作36615.2.4.使用 nopage射内余36715.2.5.币新映的定10区15.2.6.重折映射RAM.15.2.7.重射内核虚拟地址37315.3.进行直接IO37415.3.1.乒步DO37654.直接内存存取…37915.4,1.一个DMA数据传输的概况37915.4.2.分院DMA缓冲15.4.3.总线地放…15.4.4.用DMA层15.4.5.ISA设备的DMA15.5.快速参考15.5.1.介性材.395155.2.实现mmap39615.5.3.实现直接O397Linuⅸx公社(Linuxdo.com)是包括Ubuntu,Fedora,SUSE技术,最新I资讯等Linux专业类网站www.linuxidc.comLINUX DEVICE DRIVERS, 3RD EDITION15.5.4.直接内存存取第16章块驱动40016.1.注册40016.1.1.块坐动注40016.1.2.磁盘注册40116.1.3.在 skull中的初始化40316.1.4.注意应大小405162.块设备操作40516.2,1.0pen和 release方法40516.2.2.支持可移出的介质…-40716.2.3. ioctl方法407163.请求处埋40816.3.1.彩请求方法的介绍40816.3.2.一个单的请求方法40916.3.3.请求从列4116.3.4.请求的分析16.3.5.请求完成函数419164.一些其他的细节42316.4.,1.阶令预准备……161.4.2.做标识的命令42416.5.快速参考426第17章网终驱动43017.1. SNULL是如何设计的43017.1.1.分现P号43717.1.2.报文的物理传送.43317.2.连接到内核43317.2.1.设备注珊17.2.2.初始化每一个设备43517.2.3.模块卸载43617.3. NET DEVICE结构的详情.43717.3.1.全局信息17.3.2.预件信总43717.3.3.接信息43817.3.4.设备方法17.3.5.公用成员174.打开与关闭44517.5.报文传送44617.5.1.控制发送并发44817.5.2.传送超的4817.5.3.发散汇荣O.44917.6.报文接收,17.7.中断处理17.8接收中断缓解.45417.9.连接状态的改变45617.10. SOCKET缓存45717.10.1.至要成员交星.45717.10.2.作用于s0cket缓存的西数45817.11.MAC地址解析46017.11.1.以太网使闭ARP46017.11.2.不考虑ARP46l77.11.3.以太网义部46117.12.定制 IOCTL命令17.13.统计信息46317.14.多播……4617.14.1.播的内核支持46517.14,2.型实塊466Linuⅸx公社(Linuxdo.com)是包括Ubuntu,Fedora,SUSE技术,最新I资讯等Linux专业类网站www.linuxidc.comLINUX DEVICE DRIVERS, 3RD EDITION17.15.几个其他细节46717.15.1.立架个的接/文持46717.15.2. ethod!支持46877.. netpoll46817.16.快速参考第18章TTY驱动…18.1.个小TTY驱动18.1.1.结构 struct termios182. TTY DRIVER函数指针47818.2,1.0pen和c!Opse18.2.2.数据48118.2.3.其他缓计图数18.2.4.无nead函数18.3.TTY线路设置48418.3.,l. set termios数48418.3. 2. tiocmget Flltiocmset486l84. IOCTLS函数487185.TTY设备的PROC和 SYSFS处理…490186. TTY DRIVER结构的细节49118.7. TTY OPERAIONS结构的细节493188. TTY STRUCT结构的细节49518.9.快速参考Linuⅸx公社(Linuxdo.com)是包括Ubuntu,Fedora,SUSE技术,最新I资讯等Linux专业类网站www.linuxidc.comLINUX DEVICE DRIVERS, 3RD EDITION第1章设备驱动简介以Linuⅹ为代表的自由操作系统的很多优点之一,是它们的内部是开放给所有人看的.操作系统,曾经是一个隐藏的神秘的地方,它的代码只局限于少数的程序员,现在已准备好让仁何具备必要技能的人来检査,理解以及修改.Linuⅹ已经帮助使操作系统民ⅰ化. Linux内核保留有大量的复杂的代码,但是,那些想要成为内核 hacker的人需要一个入口点,这样他们可以进入代码中,不会被代码的复杂性压倒.通常,设备驱动提供了这样的门路.驱动程序在 Linux內核里扮演着特殊的角色.它们是截然不冋的″黑盒子",使硬件的特殊的一部分响应定义好的内部编程接口.它们完全隐藏了设备工作的细节.用户的汩动通过一套标准化的调用来进行,这些调用与特别的驱动是独立的;设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上.这个编程接口是这样,驱动可以与內核的其他部分分开建立,并在需要的时候在运行时"插入".这种模块化使得 Linux驱动易写,以致于口前有几百个驱动可用.编写 Linux设备驱动有许多理由让人感兴趣.可用的新硬件出现的速率(以及陈旧的速率)就确保了驱动编写者在可见的将来內是忙碌的.个别人可能需要了解驱动以便存取一个他们感兴趣的特殊设备.硬件供应商,通过为他们的产品开发 Linux驱动,可以给他们的濬在市场增加大量的正在扩张的 Linux用户基数.还有 Linux系统的丌放源码性质意味着如果驱动编写者愿意,驱动源码能够快速地散布到几百万用户本书指导你如何编与你自己的驱动,以及如何利用内核相关的韶分,我们采用一种设备-独立的方法编程技术和接口,在任何可能的时候,不会捆绑到任何特定的设备.每个驱动都是不同的;作为个驱动编写者,你需要深入理解你的特定设备.但是大部分的原则和基本技术对所有驱动都是一样的.本书无法教你关于你的设备的东西,但是它给予你所需要的使你的设备运行起来的背景知课的指导在你学习编写驱动时,你通常会发现大量有关 Linux内核的东西.这也许会帮助你理解你的机器是如何工作的,以及为什么事情不是如你所愿的快,或者不是如你所要的进行.我们会逐步个绍新概念,由非常简单的驱动开始并建立它们;每一个新概念都伴有例」代供,这样的代码个需要特别的使件来测试.本章不会真正进入编写代码.但是,我们介绍一些 Linux内核的背景概念,这样在以后我们动手编程时,你会感到乐于知道这些1.1.驱动程序的角色作为一个程序员你能够对你的驱动作出你自己的选择,并所需的编程时间和结果的灵活性之间,选择一个可接受的平衡,尽管说一个驱动是灵活“"的,听起来有些奇怪,但是我们意欢这个字眼,因为它强调了一个驱动程序的角色是提供机制,而不是策略.机制和策略的区分是其中一个在UniX设计背后的最好观念.大部分的编程问题其实可以划分为2部分:"提倛牛么能力"(机制)和如徊使用这些能力"(策略).如果这两方面由程序的不同部分来表达,或者甚至由不同的程序共同表达,软件包是非常容易开发和适应特殊的需求例如,图形显示的Unix管理划分为ⅹ服务器,它理解硬件以及提供了统一的接口给用户程序,还冇窗凵和会话管理器,它实现了个特别的策略,而刈硬件无所知.人们可以在不同的硬件上使用相同的窗口管理器,而且不同的用户可以在同一台工作站上运行不同的配置.甚至完全不同的桌面环境,例如KDE和 GNOME,可以在同一系统中共存.另个例子是TCP/P网络的分层结构:操作系统提供ske!抽象冖它对要传送的数据Linuⅸx公社(Linuxdo.com)是包括Ubuntu,Fedora,SUSE技术,最新I资讯等Linux专业类网站