Linux内核的软中断软中断执行分析.docVIP

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

Linux 内核软中断(softirq)执行分析 Author:??sinister Email:???sinister@ Homepage: Date:????2007-01-11 本文对 Linux 内核软中断的执行流程进行了分析,并尽可能的结合当前运 行环境详细地写出我的理解,但这并不表明我的理解一定正确。这本是论坛 里的一篇帖子,发出来是为了抛砖引玉,如果您在阅读本文时发现了我的错 误,还望得到您的指正。 今天无意中看了眼 2.6 内核的软中断实现,发现和以前我看到的大不相同 (以前也是走马观花,不大仔细),可以说改动很大。连 softirq 的调用 点都不一样了,以前是三个调用点,今天有哪些信誉好的足球投注网站了一下源代码,发现在多出了 ksoftirqd 后,softirq 在系统中的调用点仅是在 ISR 返回时和使用了 local_bh_enable() 函数后被调用了。网卡部分的显示调用,我觉得应该不 算是系统中的调用点。ksoftirqd 返回去调用 do_softirq() 函数应该也只 能算是其中的一个分支,因为其本身从源头上来讲也还是在 ISR 返回时 irq_exit() 调用的。这样一来就和前些日子写的那份笔记(Windows/Linux /Solaris 软中断机制)里介绍的 Linux 内核部分的软中断有出处了,看来 以后讨论 Linux kernel 代码一定要以内核版本为前题,要不非乱了不可。 得买本 Linux 方面的书了,每次上来直接看相关代码也不是回事,时间也 不允许。 // // do_IRQ 函数执行完硬件 ISR 后退出时调用此函数。 // void irq_exit(void) { account_system_vtime(current); trace_hardirq_exit(); sub_preempt_count(IRQ_EXIT_OFFSET); // // 判断当前是否有硬件中断嵌套,并且是否有软中断在 // pending 状态,注意:这里只有两个条件同时满足 // 时,才有可能调用 do_softirq() 进入软中断。也就是 // 说确认当前所有硬件中断处理完成,且有硬件中断安装了 // 软中断处理时理时才会进入。 // if (!in_interrupt() local_softirq_pending()) // // 其实这里就是调用 do_softirq() 执行 // invoke_softirq(); preempt_enable_no_resched(); } #ifndef __ARCH_HAS_DO_SOFTIRQ asmlinkage void do_softirq(void) { __u32 pending; unsigned long flags; // // 这个函数判断,如果当前有硬件中断嵌套,或者 // 有软中断正在执行时候,则马上返回。在这个 // 入口判断主要是为了与 ksoftirqd 互斥。 // if (in_interrupt()) return; // // 关中断执行以下代码 // local_irq_save(flags); // // 判断是否有 pending 的软中断需要处理。 // pending = local_softirq_pending(); // // 如果有则调用 __do_softirq() 进行实际处理 // if (pending) __do_softirq(); // // 开中断继续执行 // local_irq_restore(flags); } // // 最大软中断调用次数为 10 次。 // #define MAX_SOFTIRQ_RESTART 10 asmlinkage void __do_softirq(void) { // // 软件中断处理结构,此结构中包括了 ISR 中 // 注册的回调函数。 // struct softirq_action *h; __u32 pending; int max_

文档评论(0)

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

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

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档