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