第9章中断处理.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章中断处理.doc

第9章 中断处理 中断是硬件管理的最终资源。众所周知,设备利用中断来通知软件可以对它进行操作了。Linux为中断处理提供了很好的接口。事实上中断处理的接口如此之好,以至于编写和安装中断处理程序几乎和编写其它核心函数一样容易。但是由于中断处理程序和系统的其它部分是异步运行的,使用时要注意一些事项。 本章的示例代码使用并口来产生中断。因此,如果你想运行测试程序,你必须给你的电烙铁接上电源,即使在上一章的例子程序中你拒绝这样做。 我们用上一章的short模块来示范如何使用中断。这个模块的名字,short,实际上是指 short int(这是C语言,不是吗?),提醒我们它要对中断(interrupt)进行处理。 准备并口 虽然我在第8章“硬件管理”的“使用并口”一节已经提到,并口很简单,但它也会触发中断。打印机就是利用这种能力来通知lp驱动程序它已准备好接收缓冲区中的下一个字符。 在指定接口这样做之前实际上并不会产生中断;并口标准规定设置2号端口的第4位(0x37a,0x27a或其它某个地址)时启动中断报告。short模块在初始化时调用outb设置该位。 启动中断报告之后,每当引脚10(所谓的ACK位)上的电平从低变高时,并口都会产生一个中断。强迫接口(没有把打印机连到端口上)产生中断的最简单方法是将并行插座的引脚9和引脚10相连。为此,你需要一个阳性的D型插座和一英寸的电缆线。 引脚9是并行数据字节中最重要的一位。如果你往/dev/short0中写入二进制数据,就可以产生几个中断。然而,往端口中写入ASCII文本将不会产生中断,因为此时不会设置这个最重要的位。 如果你确实想“看看”产生的中断,那么,仅仅往硬件设备中写是不够的;还必须在系统中配置一个软件处理程序。目前,Linux-x86和Linux-Alpha只是简单的确认,忽略任何在预料之外的中断。 安装中断处理程序 中断信号线是宝贵并且非常有限的资源,当只有15或16根中断信号线时尤其如此。内核维护了一个类似于I/O端口注册表的中断信号线的注册表。一个模块可以申请一个中断通道(或中断请求IRQ,即Interrupt ReQuest),并且,处理完以后还可以释放掉它。在linux/sched.h头文件中申明的下列函数实现了这个接口: int request_irq(unsigned int irq, void (*handler)(int, void*, struct pt_regs *), unsigned long flags, const char *device, void *dev_id); void free_irq(unsigned int irq, void *dev_id); 注意,1.2版定义了不同的原型。相关的移植问题可参见本章稍后的“IRQ处理程序的版本相关性”一节。 通常,申请中断的函数的返回值为0时表示成功,或者返回一个负的错误码。函数返回-EBUSY通知另一个设备驱动程序已经使用了要申请的中断信号线的情况并不常见。函数参数定义如下: unsigned int irq 该参数为中断号。有时从Linux中断号到硬件中断号的映射并不是一对一的。例如,在arch/alpha/kernel/irq.c文件中可以查看到Alpha上的映射。这里,传递给内核函数的参数是Linux中断号而不是硬件中断号。 void (*handler)(int,void *,struct pt_regs *) 指向要安装的中断处理函数的指针。 unsigned long flags 如你所想,这是一个与中断管理有关的各种选项的字节掩码。 const char *device 传递给request_irq的字符串,在/proc/interrupts中用于显示中断的拥有者(参见下一节)。 void *dev_id 这个指针用于共享的中断信号线。它是一个唯一的标志符,更象一个ClientDate(C++中的this对象)。设备驱动程序可以自由地任意使用dev_id。除非强制使用中断共享,dev_id通常被置为NULL。在后面的“实现一个处理程序”一节中,我们将看到一个使用dev_id的实际例子。 在flags SA_INTERRUPT 如果设置该位,就指示这是一个“快速”中断处理程序;如果清除这位,那么它就是一个“慢速”中断处理程序。快速中断处理程序和慢速中断处理程序的概念在下面的“快速和慢速处理程序”一节中会谈到。 SA_SHIRQ 该位表明中断可以在设备间共享。共享的概念 SA_SAMPLE_RANDOM 该位表明产生的中断对/dev/random和/dev/urandom设备要使用的熵池(entropy pool)有贡献。读这些设备返回真正的随机数,它

文档评论(0)

aiwendang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档