谈谈对linux操作系统中断和异常的理解

先来个网上到处都有的定义吧:
中断可分为同步(synchronous)中断和异步(asynchronous)中断:
同步中断是当指令执行时由 CPU 控制单元主动产生,之所以称为同步,是因为只有在一条指令执行完毕后 CPU 才会发出中断,而不是发生在代码指令执行期间,比如系统调用,根据 Intel 官方资料,同步中断称为异常(exception),异常可分为故障(fault)、陷阱(trap)、终止(abort)三类。
异步中断是指由其他硬件设备依照 CPU 时钟信号随机产生,即意味着中断能够在指令之间发生,例如键盘中断,异步中断被称为中断(interrupt),中断可分为可屏蔽中断(Maskable interrupt)和非屏蔽中断(Nomaskable interrupt)。
非屏蔽中断(Non-maskable interrupts,即NMI):就像这种中断类型的字面意思一样,这种中断是不可能被CPU忽略或取消的。NMI是在单独的中断线路上进行发送的,它通常被用于关键性硬件发生的错误,如内存错误,风扇故障,温度传感器故障等。
可屏蔽中断(Maskable interrupts):这些中断是可以被CPU忽略或延迟处理的。当缓存控制器的外部针脚被触发的时候就会产生这种类型的中断,而中断屏蔽寄存器就会将这样的中断屏蔽掉。我们可以将一个比特位设置为0,来禁用在此针脚触发的中断。

先提炼一下重点:

  1. 同步中断称为异常,是CPU主动产生
  2. 异步中断被称为中断,是由外部硬件设备产生

这个就是中断和异常最重要的区别,针对这个区别,内核对中断和异常会有着不同的处理方式。
比如,中断处理或者异常处理时,内核能够休眠吗?
这个问题困扰了我许久~,相信目前我应该有了正确的理解。
首先,中断处理,是不能休眠的—这就是为什么许多教程或者博客里说的,中断处理函数中,通过kmalloc申请内存,需要使用GFP_ATOMIC这个标志。
具体原因网上有很多非常好的解释文档,这里就不细说了。
另外有一点有必要强调的,现在许多架构的芯片,在cpu处理中断的过程中,默认会disable中断控制位,也就是把cpu的硬件状态设置为不接收中断,如果中断处理函数休眠了,那么下一个task执行的时候必然会受到中断disable的影响。
那么,异常处理函数,能够休眠吗----答案是yes,这就是为什么,我们查看缺页异常处理函数(虽然我们经常说缺页中断,但是显而易见缺页是一个异常)时发现,分配匿名页时并没有使用GFP_ATOMIC标志。
然而,为什么异常处理可以休眠呢?
异常,和那些外设中断,本质应该是不一样的,异常说白是代码自己“主动”触发的,此时os的作用就是帮助代码修复错误,异常的执行主体还是触发异常的task本身,但是中断触发时的执行主体就是随机的了,异常里休眠,本质就是触发异常的这个task休眠,这个本身并没有问题;并且,异常处理的时候,中断应该也是没关的,这时候来个时钟中断,也能够触发调度的,但是,就是因为异常的执行主体,就是进程本身,白了就是,进程跑着跑着,发现有异样,就跳转到os的某个流程处理一下这个异样,处理完回来接着跑,休眠并没有问题。

异常是否可以嵌套呢?中断呢?
我在arm64上试了一下,异常是可以嵌套的。
那中断呢?按照上面说的,现在许多架构的芯片,在cpu处理中断的过程中,默认会disable中断控制位,而且,即使以前架构硬件上不支持这么做,linux的设计也是进入一个中断处理函数后,会disable掉全局中断,因而,中断是不能够嵌套处理的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值