内核中断,异常,抢占总结篇一、基本概念中断分为同步中断和异步中断
同步中断是由CPU控制单元产生的,“同步”是指只有在一条指令执行完毕后,CPU才会发出中断,而不是发生在代码指令执行期间,比如系统调用
而异步中断是由其他硬件设备依照CPU时钟信号产生的,即意味着中断能够在指令之间发生,例如键盘中断
按照Intel的微处理器手册,同步中断和异步中断也分别称为异常(或者软件中断)和中断
中断大家都比较熟悉,是由硬件设备产生的
异常的产生源有两种:一种是由程序的错误产生的,内核通过发送一个Unix程序员都熟悉的信号来处理异常;第二种时内核必须处理的异常条件产生的,此时内核执行恢复异常需要的所有步骤,例如缺页,或对内核服务的一个请求(系统调用,通过一条int指令)
有一个知识点值得了解:内核态能够触发的唯一异常就是缺页异常,其他的都是用户态触发的
二、硬中断、软中断、异常之间的抢占关系硬中断可以被另一个优先级比自己高的硬中断“中断”,不能被同级(同一种硬中断)或低级的硬中断“中断”,更不能被软中断“中断”
软中断可以被硬中断“中断”,但是不会被另一个软中断“中断”
在一个CPU上,软中断总是串行执行
所以在单处理器上,对软中断的数据结构进行访问不需要加任何同步原语
(关于这一点,我对《深入理解linux内核》第三版P223页中保护可延迟函数所访问的数据结构有疑问,书上说保护可延迟函数(软中断)所访问的数据结构应采取的措施:对于单处理器的情况,在单处理器上不存在竞争条件,这是因为可延迟函数(软中断)的执行总是在一个CPU上串行执行--也就是说,一个可延迟函数不会被另一个可延迟函数中断
因此,根本不需要同步原语
我认为:一个软中断虽然不会被另一个软中断“中断”,但是可能被硬中断“中断”,而硬中断最后还是要执行到软中断,因此还是会形成对资源的临界区访问
我觉得在保护软中断时,应该关闭本地