内核中断,异常,抢占总结篇.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文档。上传文档
查看更多
内核中断,异常,抢占总结篇

内核中断,异常,抢占总结篇 一、基本概念 中断分为同步中断和异步中断。同步中断是由CPU控制单元产生的,“同步”是指只有在一条指令执行完毕后,CPU才会发出中断,而不是发生在代码指令执行期间,比如系统调用。而异步中断是由其他硬件设备依照CPU时钟信号产生的,即意味着中断能够在指令之间发生,例如键盘中断。 按照Intel的微处理器手册,同步中断和异步中断也分别称为异常(或者软件中断)和中断。中断大家都比较熟悉,是由硬件设备产生的。异常的产生源有两种:一种是由程序的错误产生的,内核通过发送一个Unix程序员都熟悉的信号来处理异常;第二种时内核必须处理的异常条件产生的,此时内核执行恢复异常需要的所有步骤,例如缺页,或对内核服务的一个请求(系统调用,通过一条int指令)。有一个知识点值得了解:内核态能够触发的唯一异常就是缺页异常,其他的都是用户态触发的。 二、硬中断、软中断、异常之间的抢占关系 硬中断可以被另一个优先级比自己高的硬中断“中断”,不能被同级(同一种硬中断)或低级的硬中断“中断”,更不能被软中断“中断”。 软中断可以被硬中断“中断”,但是不会被另一个软中断“中断”。在一个CPU上,软中断总是串行执行。所以在单处理器上,对软中断的数据结构进行访问不需要加任何同步原语。 (关于这一点,我对《深入理解linux内核》第三版P223页中保护可延迟函数所访问的数据结构有疑问,书上说保护可延迟函数(软中断)所访问的数据结构应采取的措施:对于单处理器的情况,在单处理器上不存在竞争条件,这是因为可延迟函数(软中断)的执行总是在一个CPU上串行执行--也就是说,一个可延迟函数不会被另一个可延迟函数中断。因此,根本不需要同步原语。我认为:一个软中断虽然不会被另一个软中断“中断”,但是可能被硬中断“中断”,而硬中断最后还是要执行到软中断,因此还是会形成对资源的临界区访问。我觉得在保护软中断时,应该关闭本地软中断,比如用local_bh_disable) 还没写完这篇博客,就知道我在这个问题上错了。附上在Linux 内核开发中文邮件列表上某位仁兄提供的解答。 开始处理软中断的情况主要是 1、中断退出执行的irq_exit 2、内核线程ksoftirqd 3、local_bh_enable 而 asmlinkage void do_softirq(void) { ? ? ? ?unsigned long flags; ? ? ? ?struct thread_info *curctx; ? ? ? ?union irq_ctx *irqctx; ? ? ? ?u32 *isp; ? ? ? ?if (in_interrupt()) ? ? ? ? ? ? ? ?return; .... } 可以看到,in_interrupt 判断,当前若是从硬件中断退出后执行的irq_exit进入的do_softirq,则立即返回,可以避免你说的情况 本文最后还将附上一篇软中断源码的分析,很详细地说明了这个问题。 硬中断和软中断都可以抢占(或者称为中断)异常(最典型的是系统调用),但是异常不能抢占硬中断和软中断。 硬中断和软中断(只要是中断上下文)执行的时候都不允许内核抢占,换句话说,中断上下文中永远不允许进程切换。(个人理解,由于中断处理程序都需要较快地完成,而且中断处理程序可以嵌套,因此中断处理程序必须不能阻塞,否则性能就非常不能保证了。) 三、用户抢占和内核抢占 抢占分两种情况:用户抢占和内核抢占,其中内核抢占在Linux2.5.4版本发布时被并入内核的,通SMP一样作为内核的一项标准可选配置。 1、用户抢占:内核即将返回用户空间的时候,如果need resched标志被设置,会导致schedule()被调用,此时就会发生用户抢占。在内核返回用户空间的时候,它知道自己是安全的。所以,内核无论是在从中断处理程序还是在系统调用后返回,都会检查need resched标志。如果它被设置了,那么,内核会选择一个其他(更合适的)进程投入运行。在内核抢占还没有出现的时候,内核所有的抢占情况都是用户抢占。 2、内核抢占:内核抢占是指,一个在内核态运行的进程,可能在执行内核函数期间被另一个进程取代。不是在内核的任何一个地方都可以发生内核抢占的。 内核不能被抢占的情况如下: 1)内核正进行中断处理。在Linux内核中进程不能抢占中断(中断只能被其他中断中止、抢占,进程不能中止、抢占中断),在中断例程中不允许进行进程调度。进程调度函数schedule()会对此作出判断,如果是在中断中调用,会打印出错信息。 2)内核正在进行中断上下文的Bottom Half(中断的底半部)处理。硬件中断返回前会执行软中断,此时仍然处于中断上下文中。 3)内核的代码段正持有spinlock

文档评论(0)

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

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

1亿VIP精品文档

相关文档