快速业务通道

《Essential Linux Device Drivers》第4章

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-16
4 打下基础<?XML:NAMESPACE PREFIX = O /> 我们现在已经与编写设备驱动之间的距离已经非常逼近.但是,在此之前,让我们先装备一些驱动的概念.本章开始于对本书的问题陈述的理念,接下来分析PC兼容的系统和嵌入式计算机中典型的设备和I/O接口.中断处理在大多数驱动中的都存在,因此,本章讨论了编写中断服务程序的方法问题.之后,我们将注意力转移到了2.6内核中新引入的设备模型,该新模型建立于sysfskobject、设备类、udev等抽象事物上,它们是从设备驱动中提炼出来的有共性的东西.新的设备模型也需要内核空间之外的策略,这些策略被推到用户空间,这导致了/dev结点管理、热插拔、冷插拔、模块自动加载、固件下载等功能的改变. 设备和驱动介绍 对硬件的操作要求拥有执行特殊指令和处理中断等处理器特权,用户应用程序一般不能直接和硬件通信.设备驱动则承担了硬件交互的工作,它也向应用程序和内核中其他的部分引出接口这些接口.应用程序通过/dev目录中的设备结点可对设备进行操作,通过/sys目录中的结点可以收集设备信息[1]. [1]以后你将学习到,网络应用程序通过不同的机制将请求发给底层驱动. 4.1是一个典型的PC兼容的系统的硬件块结构图.从图中可以看出,系统支持各种各样的设备和接口,如内存、视频、音频、USBPCIWiFiI<?XML:NAMESPACE PREFIX = ST1 />2CIDE、以太网、串口、键盘、鼠标、软驱、并口和红外等.内核控制器和图形控制器在PC体系结构中位于北桥芯片组中,然后外设总线则源自南桥芯片组. 4.2给出了一个假想的嵌入式设备的类似于图4.1的块图.该图中包含了数个PC中通常不存在的接口,如闪存、LCD、触摸屏和无线调制解调器. 显然,访问外设的能力是系统整体机能的重要组成部分.设备驱动提供了达到此目的的引擎.本书中剩余的章节将聚焦于设备结构,并将会读者怎样实现相应的设备驱动. 中断处理 I/O操作的不确定因素,以及处理器和I/O设备之间速度的不匹配,设备往往通过某种硬件信号异步地唤起处理器的注意.这些硬件信号就是所谓的中断.每个中断设备都被分配给一个相关的标识符,被称为中断请求(IRQ)号.当处理器检测到某一IRQ号对应的中断产生时,它将停止它现在的工作,并引用该IRQ所对应的中断服务例程(ISR).中断处理函数ISR在中断上下文执行. 中断上下文 ISR是与硬件交互的非常重要的代码片段.它们被给予了立即执行的特权,以便最大化系统的性能.不过,如果ISR执行过慢、负载太重的化,就违背了自身的设计哲学.贵宾都被给予了优惠待遇,但是,尽量减少由此造成的对公众的不便也是他们的义务.为了对粗暴打断当前执行线程的行为进行补偿,ISR不得不礼貌地执行于受限制的环境下,即所谓的中断上下文(或原子上下文). 下面给出了中断上下文可为和不可为事项的列表: 1. 如果你的中断上下文进入睡眠,它是一项应该被处以监禁的罪行.中断处理函数不能通过调用schedule_timeout()等睡眠函数放弃处理器,在中断处理函数中调用一个内核API之前,应该仔细分析它以确保其内部不会触发阻塞等待.例如,input_register_device()表面上看起来没有问题,但是它内部以GFP_KERNEL为参数调用了kmalloc().从第2章《内核一瞥》可以看出,用这种方式调用kmalloc()的话,如果系统的空闲内存低于某门限,kmalloc()将睡眠等待swapper释放内存. 2. 为了在中断处理函数中保护临界区,你不能使用互斥体,它们也许导致睡眠.应该使用自旋锁代替互斥体,但是一定要记住的是只有真正需要的时候才采用它. 3. 中断处理函数不能与用户空间直接交互数据,它们经由进程上下文与用户空间建立连接.这也是为什么中断处理函数不能睡眠的第2个理由:调度器工作于进程之间,如果中断处理函数睡眠并被调度出去,它们怎么返回到运行队列呢? 4. 中断处理函数一方面需要快速地出来,另一方面又需要完成它的工作.为了规避这种冲突,中断处理函数通常被分成2个部分.瘦小的顶半部标志一个响应以宣称它已经服务了该中断,而重大的工作负载都被丢给了肥胖的底半部.底半部的执行被延后,在其执行环境中,所有的中断都是使能的.在讨论softirqtasklet的时候,你将学习到真也难怪开发底半部. 5. 中断处理函数不必是可重用的.当某中断被执行的时候,在它返回之前,相应的IRQ都被禁止了.因此,与进程上下文代码不同的是,同一中断处理函数的不同实例不可能同时运行在多个处理器上. 6. 中断处理函数可以被更高优先级IRQ的中断处理函数打断.如果你请求内核将你的中断处理函数作为快中断处理的话,此类中断嵌套将被禁止.快中断服务函数运行的时候,本处理器上的所有中断都会被禁止.在禁止中断或将你的中断标识为快中断之前,请意识到中断屏蔽对系统性能的坏处.中断屏蔽的时间越长,中断延迟就会更长,或者说已经被产生的中断得到服务的延迟就会越久.中断延迟与系统真实的响应时间成反比. 函数中可以检查in_interrupt()的返回值以查看自身是否位于中断上下文. 与外部硬件产生的异步中断不一样,也存在同步到达的中断.同步中断意味着它们不会不期而遇,它们由处理器本身执行某指令而产生.外部中断和同步中断在内核中使用相同的机制处理.
class_device_destroy()
class_create()
class_destroy()
class_device_create_file()
sysfs_create_file()
class_device_add_attrs()
kobject_uevent()
fs/sysfs/file.c
至此,设备驱动的一些重要概念就介绍完成了.在开发具体设备驱动的时候,读者可以返回本章进行深入挖掘.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多
你可能对下面的文章感兴趣
上一篇: 关于《详解》第12.1节按键驱动的进一步阐述下一篇: 定时自动重启IIS和定时重启服务器

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号