写在前面
- 什么是中断
- 什么是陷入
参考
中断
中断是指CPU对I/O设备发来的中断信号的一种响应。CPU暂停正在执行的程序,保留CPU环境后,自动地去执行该I/O设备的中断处理程序。执行完后,再回到断点,继续执行原来的程序。I/O设备可以是字符设备,也可以是块设备、通信设备。由于中断时由外部设备引起的,故又称外中断。
在操作系统中,实现从用户态进入核心态的唯一途径就是通过中断或异常。当中断或异常发生时,运行用户态的CPU会立即进入核心态,这是通过硬件实现的。
中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
引起中断发生的事件被称为中断源。中断源向CPU发出的请求中断处理信号称为中断请求。CPU收到中断请求后转到相应的事件处理程序称为中断响应。
中断也称外中断,指来自CPU执行指令以外的事件的发生,如设备发出的I/O结束中断,表示设备输入/输出处理已经完成而希望处理机能够向设备发下一个输入/输出请求,同时让完成输入/输出后的程序继续运行;时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。中断通常与当前处理机运行的程序无关。
断向量表
为每种设备配以相应的中断处理程序,把该程序的入口地址放在中断向量表的一个表项中,并规定一个中断号用于设备的中断请求。
中断优先级
系统中有多个中断信号源,系统为他们规定不同的优先级。如:键盘<打印机<磁盘
陷入
另外一种由CPU内部事件所引起的中断,例如进程在运算中发生了上溢或者下溢,有如程序出错,如非法指令,地址越界等。通常把这类中断称为内中断或者陷入。若系统发现有陷入事件,CPU也将暂停正在执行的程序,转去执行该陷入事件的处理程序。中断和陷入的主要区别是信号的来源,既是来自CPU外部,还是CPU内部。
对中断的处理方式
- 屏蔽(禁止)中断
当处理机正在处理一个中断时,将屏蔽掉所有的中断,即处理机对任何新到的中断请求,都暂时不予理睬,而让他们等待,直到处理机已完成本次中断的处理后,处理机再去检查是否有中断发生。若有,再去处理新到的中断,若无,则返回被中断的程序,在该方法中,所有中断都按顺序依次执行,优点是简单,不适合用于对实时性要求较高的中断请求。
- 嵌套中断
在设置了中断优先级的系统中。通常按这样的规则来处理中断.当同时有多个不同优先级的中断请求时,CPU优先响应最高优先级的中断请求。高优先级的中断请求可以抢占正在运行的低优先级中断的处理机。
中断处理程序的处理过程
- 测定是否有未响应的中断信号。
当设备完成一个字符的读入(如字符设备),设备控制器向处理机发送一个中断请求信号,请求处理机将字符读入内存。处理机执行完当前指令后都要检测是否有未响应的中断信号。若没有继续执行下一条指令,若有,则停止原有进程的执行,准备转去指向中断处理程序,为处理机的控制权交给中断程序
保护被中断进程的CPU环境。
转入相应的设备处理程序。
处理机测试各个中断源,确定IO设备,并发送确认信号。设备收到信号后,取消中断请求信号。将设备中断处理程序的入口地址装入到程序计数器中,这样,当处理机运行时,便可以自动转向中断处理进程。
中断处理。
恢复CPU的现场并退出中断。
中断处理完成后,恢复CPU现场,退出中断。是否返回被中断的进程,取决于:
采用屏蔽中断方式。返回至被中断的进程
采用中断嵌套方式,考虑有无优先级更高的中断请求
时钟中断
在Linux的0号中断是一个定时器中断。在固定的时间间隔都发生一次中断,也是说每秒发生该中断的频率都是固定的。该频率是常量HZ,该值一般是在100 ~ 1000之间。该中断的作用是为了定时更新系统日期和时间,使系统时间不断地得到跳转。另外该中断的中断处理函数除了更新系统时间外,还需要更新本地CPU统计数。指的是调用scheduler_tick递减进程的时间片,若进程的时间片递减到0,进程则被调度出去而放弃CPU使用权。
Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这个脉冲送入CPU,就可以引发一个中断请求信号,我们就把它叫做时钟中断。
“时钟中断”是特别重要的一个中断,因为整个操作系统的活动都受到它的激励。系统利用时钟中断维持系统时间、促使环境的切换,以保证所有进程共享CPU;利用时钟中断进行记帐、监督系统工作以及确定未来的调度优先级等工作。可以说,“时钟中断”是整个操作系统的脉搏。
从本质上说,时钟中断只是一个周期性的信号,完全是硬件行为,该信号触发CPU去执行一个中断服务程序,但是为了方便,我们就把这个服务程序叫做时钟中断。