Linux中断处理过程

中断被触发后首先通知到的是CPU

1.CPU需要判断自己当前所处的模式,根据CPL寄存器的值执行不同操作。如果CPL表明目前正处于内核态,则不需要作切换,相反,如果CPL表明目前是用户态,那么需要将自己标为标为内核态。当然,在标记自己之前,必然会存在一些寄存器的保存以便日后恢复。

2. 需要做一些现场保护工作,就是把当前的寄存器存起来以便恢复。这个是跟用户态和内核态无关的,而是CPU当前所处的一个状态的信息保存。

3. 终于进入真正的中断了,CPU落到了中断向量表上,这里有一段汇编程序,根据中断的类型跳转到不同的系统中断号(irq),这里所说的irq是Linux定义的一个中断映射表了。

4. 已经到达具体的中断号的程序里面了。首先中断次数统计+1, 然后,还记得SA_INTERRUPT, SHR_INTERRUPT吗?对了,中断注册时设置的中断类型。这里就根据中断类型的不同,选择中断继续打开(共享)还是中断暂时关闭(快速),这里会调用类似sti这样的底层函数来控制中断的使能与否(OS级别的使能啦,与真正的硬件使能是两回事)。

5. OK,调用注册时的中断句柄了。

6. 执行完毕后,中断次数统计-1。

7. 中断已经处理完毕,要返回了。这时候出现了Linux特有的可能发生调度的时机,这个要与step1对应起来了。

7.1 如果原来的CPL标记是内核态的,那么直接恢复寄存器后返回了。

7.2 如果原来的CPL标记是用户态的,那么并不直接就恢复寄存器返回用户态的,而是在恢复前根据need_scheduled变量标志调用schedule()函数,这个是Linux指定的几个调度时机之一。

8. 整个过程完毕了,以上的过程并没有讲述到软中断,实际上在6执行完毕后,是有可能会执行软中断的,软中断是一种延时处理中断事件的方法,具体过程再议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值