异常和中断
-
概念: 程序执行过程中CPU会遇到一些特殊情况,是正在执行的程序被“中断”,cpu中止原来正在执行的程序,转到处理异常情况或特殊事件的程序去执行,结束后再返回到原被中止的程序处(断点)继续执行
-
程序执行被"中断“的事件(在硬件层面)有两类
- 内部异常:在CPU内部发生的意外事件或特殊事件
- 外部中断:在CPU外部发生的特殊事件,通过“中断请求“信号向CPU请求处理。
-
异常和中断的处理
发生异常和中断事件后,系统将进入OS内核态对相应事件进行处理,即改变处理器状态(用户态->内核态)
异常的分类
-
故障: 执行指令引起的异常事件,如溢出,非法指令,缺页,访问越权等。
”断点“为发生故障指令的地址 -
自陷:预先安排的事件(“埋地雷”),如单步跟踪,断点,系统调用等。是一种自愿中断。
”断点“为自陷指令下条指令地址 -
终止:硬故障事件,此时机器将”终止“,调出中断服务程序来重启操作系统
”断点“是什么?随便!
思考一:自陷处理完成后回到哪条指令执行?回到下条指令
思考二:哪些故障补救后可继续执行,哪些只好终止当前进程?
缺页,TLB缺失等:补救后可继续,回到发生故障的指令重新开始
溢出,除数为0,非法指令,内存保护错等:终止当前进程
“断点”:异常处理结束后回到原来被”中断“的程序执行时的起始指令
中断
1. 中断的概念
- 外设通过中断请求信号线向CPU提出”中断”请求,不由指令引起,故中断也称为异步中断。
- 事件:CTRL-C, DMA传送结束,网络数据到达,打印缺纸……
- 每执行完一条指令,CPU就查看中断请求引脚,若引脚的信号有效,则进行中断响应:将当前PC(断点)和当前机器状态保存在栈中,并“关中断”。然后,从数据总线读取中断类型号,根据中断类型号跳转到对应的中断服务程序执行。中断检测及响应过程由硬件完成。
- 中断服务程序执行具体的中断处理工作中断处理完成后,再回到被打断程序的“断点“出继续执行
2. 中断的分类
- 可屏蔽中断:通过INTR向CPU请求,可通过设置屏蔽字来屏蔽请求,若中断请求被屏蔽,则不会被送到CPU
- 不可屏蔽中断:非常紧急的硬件中断,如:电源掉电,硬件线路故障等。通过NMI向CPU请求。一旦产生,就被立即送CPU,以便快速处理。这种情况下,中断服务程序会尽快保存系统重要信息,然后在屏幕上显示相应的消息或直接重启系统。
IA-32的向量中断方式
- 有256中不同类型的异常和中断
- 每个异常和中断都有唯一的编号,称之为中断类型号.
- 每个异常和中断有与其对应的异常处理程序或中断服务程序,其入口地址放在一个专门的中断向量表或中断描述符表中。
- 前32个类型(0~31)保留给CPU使用,剩余的由用户自行定义(这里的用户指机器硬件的用户,即操作系统)
- 通过执行INT n(指令第二字节给出的中断类型号n, n=32~255)使CPU自动转到OS给出的中断服务程序执行
- 实模式下,用中断向量表描述
- 保护模式下,用中断描述表描述。
实地址模式下的中断向量表
实地址是Intel为80286及其之后的处理器提供的一种8086兼容模式,寻址空间1MB,指令地址=CS<<4+IP。从地址0~1KB大小的内存大小的内存构成一个中断向量表,位于0000H~03FFH。共256组,每组占4个字节。中断向量表中每一项是对应中断服务程序或异常处理的入口地址,被称为中断向量。
保护模式下的中断描述符表
- 保护模式下,通过中断描述表捕获异常处理或中断服务程序入口地址
- 中断描述表(Interrupt Descriptor Table,IDT)是OS内核中的一个表,共有256个表项,每个表项占8个字节,IDT共占2KB
- IDTR中存放IDT在内存中的首地址
- 每一个表项是一个中断门描述符,陷阱门描述符或任务门描述符。
开机过程(中断在其中扮演角色)
- 开机后系统首先在实地址模式下工作(只有1MB的寻址空间)
- 开机过程中,需要首先准备实模式下的中断向量表和中断服务程序。通常,由固化在主板上的一块ROM芯片中的BIOS程序完成。
- 开机过程后,需要首先准备检测显卡,键盘,内存等,并在0000H~003FFH区建立中断向量表,在中断向量所指主存区建立相应的中断服务程序。
- BIOS利用INT指令执行特定的中断服务程序把OS从磁盘加载到内存中。例如,BIOS可通过执行int 0x19指令来调用中断向量表0x19对应的中断服务程序,将启动盘上的0号磁头对应盘面的0磁道1扇区中的引导程序装入内存。
- BIOS(Basic Input/Ouput System)是基本输入输出系统的简称,是针对具体主板设计的,与安装的操作系统无关。
- BIOS包含各种基本设备驱动程序,通过执行BIOS程序**,基本设备驱动程序以中断服务程序的形式被加载到内存**,以提供基本的I/O系统调用
- 一旦进入保护模式,就不在使用BIOS