doIRQ分析及相关知识介绍.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文档。上传文档
查看更多
doIRQ分析及相关知识介绍

asmlinkage unsigned int do_IRQ(struce pt_regs regs) ? 1、??首先取得中断号,并且获取对应的irq_desc: ??? int irq = regs.orig_eax 0xff; ???// high bits used in ret_from_ code? int cpu = smp_processor_id(); irq_desc_t *desc = irq_desc + irq; 2、? 对中断芯片(模块)应答: desc-handler-ack(irq); 3、? 修改它的状态(注:觉得这些状态只有在SMP下才有意义): ??? status = desc-status ~(IRQ_REPLAY | IRQ_WAITING); status |= IRQ_PENDING; ????/* we _want_ to handle it */ IRQ_REPLAY是指如果被禁止的中断号上又产生了中断,这个中断是不会被处理的,当这个中断号被允许产生中断时,会将这个未被处理的中断转为IRQ_REPLAY。 IRQ_WAITING探测用,探测时会将所有没有挂处理函数的中断号上设置IRQ_WAITING,如果这个中断号上有中断产生,就把这个状态去掉,因此,我们就可以知道哪些中断引脚上产生过中断了。 IRQ_PENDING , IRQ_INPROGRESS是为了确保: (1) 同一个中断号的处理程序不能重入; (2) 不能丢失这个中断号的下一个处理程序。 具体的说,当内核在运行某个中断号对应的处理程序(链)时,状态会设置成IRQ_INPROGRESS。如果……时,发现已经有一个实例在运行了,就将这下一个中断标注为IRQ_PENDING,然后返回。这个已在运行的实例结束的时候,会查看是否期间有同一中断发生了,是则再次执行一遍。 这些状态的操作不是在什么情况下都必须的。 多个CPU比较复杂,因为CPU由LocalAPIC,每个都有自己的中断,但是它们可能调用同一个函数,比如时钟中断,每个CPU都可能产生,它们都会调用时钟中断处理函数。 从I/O APIC传过来的中断,如果是电平触发,也不会,因为在结束发出EOI前,这个引脚上是不接收中断信号。如果是边沿触发,要么是开中断,要么I/O APIC选择不同的CPU,在这两种情况下,会有重入的可能。 /* ??????? * If the IRQ is disabled for whatever reason, we cannot ??????? * use the action we have. ??????? */ ??????? action = NULL; ??????? if (!(status (IRQ_DISABLED | IRQ_INPROGRESS))) { ?????????????? action = desc-action; ?????????????? status = ~IRQ_PENDING; ???/* we commit to handling */ ?????????????? status |= IRQ_INPROGRESS; ?/* we are handling it *//*进入执行状态*/ ??????? } ??????? desc-status = status; ??????? /* ??????? * If there is no IRQ handler or it was disabled, exit early. ??????? ?? Since we set PENDING, if another processor is handling ??????? ?? a different instance of this same irq, the other processor ??????? ?? will take care of it. ??????? */ ??????? if (!action) ?????????? goto out;?????????? /*要么该中断没有处理函数;要么被禁止运行(IRQ_DISABLE);要么有一个实例已经在运行了*/ ????? /* ??????? * Edge triggered interrupts need to remember ??????? * pending events. ??????? * This applies to any hw interrupts that allow a second ??????? * instance of the same irq to arriv

文档评论(0)

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

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

1亿VIP精品文档

相关文档