- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 空气采样数字显示安装使用说明书1.doc VIP
- 通信综合业务知识培训_培训课件.pptx VIP
- 《菊花扦插》(教案)六年级上册劳动苏科版.pdf VIP
- [机械标准]JBT 9768-1999 内燃机 气缸套平台珩磨网纹 技术规范及检测方法.pdf
- 2025广东广州海关缉私局招聘缉私辅助人员52人备考试题及答案解析.docx VIP
- 法院服务外包诉讼服务实施方案.docx VIP
- 2025广东广州海关缉私局招聘缉私辅助人员52人考试备考试题及答案解析.docx VIP
- 口腔癌术后口腔冲洗技术——中华护理学会团体标准解读.pptx VIP
- 企业相互赠与合同范本模板.docx VIP
- 阅读见识手抄报.docx VIP
文档评论(0)