最近看到linux中断机制相关的知识,所以就根据学习做个总结,以便于后面回顾一下,同时也可以供同行交流学习具体涉及以下内容
什么是中断
中断被定义为一个事件,它能改变处理器执行指令的顺序。它对应硬件(CPU、其他硬件设备)电路产生的电信号。
按照我们自己的理解:中断就是程序在正常执行的过程中,受到其它事件的打断,停止当前程序的执行,去处理来其它事件的任务,执行完之后再回来继续执行该程序。
中断类型
中断一般分为两种类型:硬件中断和软中断
在linux内核架构书中解释:
硬件中断
由系统自身和与之连接的外设自动的产生,它用于支持高效地实现设备驱动程序,也用于引起处理器自身对异常或错误的关注。
软中断
用于有效实现内核中的延期操作。
硬件中断与软中断的区别主要在于:
硬中断是有硬件产生的;软中断的处理非常像硬中断,但是,它们仅仅是由当前正在运行的进程所产生的。
硬件中断是可以屏蔽的,而软中断不能。
硬中断处理程序需要确保尽可能快速的执行完任务,程序一般不会等待较长时间,称为上半部;软中断处理硬中断未处理完成的工作,是一种推后执行机制称为下半部。
各种类别的中断又可分为同步中断和异步中断
同步中断(异常):
这些由cpu自身产生,针对当前执行的程序。异常可能因种种原因触发
由于运行时发生的程序设计错误,或者由于出现了异常的情况或者条件,导致处理器需要“外部”的协助才能处理。
异步中断(中断):
由外设引起的中断,可能发生在任意时间。
中断处理流程
在cpu得知发生中断之后,它将进一步的处理委托给一个软件例程,该例程可能会修复故障、提供专门的处理或将外部事件通知给用户进程。由于每一个中断和异常都对应有唯一的编号,内部使用一个数组。数组项是指向处理程序函数的指针。
中断处理分为3个部分,首先接收到中断,准备好环境处理中断,接下来调用中断处理程序,最后恢复到中断之前的状态,调用中断处理程序前后两部分可以分为进入路径和退出路径。
进入和退出任务还要确保从用户态到内核态的切换,进入的关键任务是,从用户态栈切换到内核态栈,但是这一点还不够,还需要保护用户应用程序当前的寄存器状态,以便在中断结束之后恢复。与上下文切换机制是一样的
中断处理程序可能会发生困难,也别是在处理程序的期间,发生了其它中断,这里就会出现所谓的中断嵌套的问题,虽然在处理中断程序期间可以屏蔽中断,但是这会引起其他的问题,如遗落重要的中断。因此对于ISR必须满足以下要求:(1)实现必须包含尽可能少的代码,便于快速处理
(2)可以在其他ISR执行期间调用的中断处理程序例程,不能互相干扰
内核为了解决这两个问题,将每个处理程序例程分为3个部分
(1)关键操作必须在中断之后立即执行。必须禁用其它中断
(2)非关键操作也应该尽快执行完成,但是允许其他中断使能
(3)可延期的操作,不必在中断处理程序中实现的
中断嵌套
有些可能遇到中断嵌套的问题,简单的说中断可以嵌套,但是同种类型中断不能嵌套的。
中断上下文
操作系统工作模式分为内核态和用户态,内核模块运行在内核空间,而用户应用程序运行在用户空间,他们是不同的级别,对系统资源具有不同的访问权限,都分别有自己的内存映射,即自己的地址空间。
用户空间的应用程序,通过系统调用,进入内核空间。由内核代表该进程运行于内核空间,这就涉及到上下文的切换,用户空间和内核空间具有不同的地址映射,通用或专用的寄存器组,而用户空间的进程要传递很多变量、参数给内核,内核也要保存用户进程的一些寄存器、变量等,以便系统调用结束后回到用户空间继续执行。
所谓“中断上下文”,就是硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。中断上下文,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被中断的进程环境)。
关于中断上下文部分可以读一下
https://blog.csdn.net/yusiguyuan/article/details/12183743