关于do_softirq

/////////////////////// 
1.离开这个函数的时候为什么要关闭硬件中断? 代码中的提示是什么意思? 
////////////////////////
 

这是因为do_softirq()函数退出后,通常马上就要进入中断返回过程,也即内核马上就要执行arch/i386/kernel/entry.S文件中的ret_from_intr程序段,这段程序非常短,而且内核当然也希望在执行中断返回时不要再出点什么乱子:-)因此就在do_softirq()退出之前把本地中断给关了,以保证CPU能够顺利地返回到中断前的状态。 


2. 进入do_softirq时先 local_bh_disable();后 local_irq_disable(); 觉得会出问题. 
答2 
比如从系统调用返回时, 进入do_softirq. 正在执行local_bh_disable(); 把计数值读入了内存,加了一但是还未写回内存, 此时中断发生从中断中再一次进入这个函数, 因为从系统调用进入local_bh_disable();的执行还未把1回写, 所以中断返回执行时同样可以绕开中in_interrupt()的检测. 当中断中执行do_softirq返回时, bh计数变0. 然后中断返回, 系统调用的do_softirq继续执行,这此因为软中断已经被处理了, 所以空转一遍后返回. (没有问题) 
如果local_bh_disable();已经执行成功则中断返回执行的do_softirq不会进入,回立即返回,也没有问题. 
/// 

首先,声明一点,CPU访问一个内存单元时,首先是从它的cache中看看是否能命中。如果不能命中,只好乖乖地通过总线访问相应的系统RAM。明白这一点对于理解先 local_bh_disable()再后local_irq_disable()的安全性是非常重要的。 

假定SMP系统中当前CPU上的syscall返回的do_softirq()函数正在执行local_bh_disable()宏,并且刚刚执行完 local_bh_count(cpu)++语句而把CPU cache中的软中断计数值加1,却还未来得及执行barrier()操作将其回写系统内存,就被一个tmd的更高优先级的中断所打断当前执行路径,于是当前CPU只要乖乖地转入这个tmd高优先级中断服务中。但是,偏偏凑巧的是,这个tmd高优先级中断服务也调度了一个软中断服务([censored]:-),于是do_IRQ()函数只好不情愿地执行do_softirq()函数(注意!CPU执行路径已经发生变化了)。像往常一样,高优先级中断的do_softirq()函数首先执行in_interrupt()宏检查当前CPU是否已经处于中断上下文中,于是,当前CPU去读它自己的中断统计信息变量,令他高兴的是,它自己的中断统计信息已经老老实实地呆在CPU cache中了(不用访问系统RAM,不是很爽吗:-),于是当前CPU高高兴兴从他的cache中把中断统计信息读到寄存器中,然后一检查发现它非0!!!!hoho.......所以,这个tmd高优先级中断的do_softirq()函数马上罢工,什么也不干就立即返回了。 

最后,当前CPU经过一翻小小的折腾后,又老老实实地回到先前被中断的系统调用do_softirq()函数上去,继续欢快地跑着:-)当然,欠tmd高优先级中断的那次软中断服务在这里回被补上。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值