操作系统中断的运行细节
为什么要中断?
操作系统就是一个死循环,它是在不断等待待处理事件的发生,待处理事件正是通过中断的形式通知操作系统的。(操作系统是中断驱动的)
CPU对中断的支持?
1. 外部中断,直接有中断代理设备把外部设备的中断信号通过INTR或者NMI引脚输入CPU,CPU根据中断向量号到中断描述符表中找到对应的中断描述符。
2. CPU在执行指令的时候,1. 指令可能是一个中断请求,比如int3/int /into/bound/。 2. CPU会自动执行指令检查,比如div指令除数为0时会自动引发0号中断,比如当CPU无法识别当前运行的机器码码时会自动引发6号中断。
注意:异常和不可屏蔽中断的中断向量号是由CPU自动提供的;来自外部设备的可屏蔽中断号是由中断代理提供的;软中断是有软件提供的。
3. CPU规定了中断描述符表的结构:
低32位:
0 ~ 15: 中断处理程序在目标代码内的偏移量的0~15位
16 ~ 31: 中断处理程序目标代码段描述符选择子
高32位:
8 ~ 11: type
12: s位。 0表示系统段。 1表示数据段
13~14: DPL
15: P。表示这个中断描述符是否存在
16~31: 中断处理程序在目标段内的偏移量的16~31位
4. CPU在进入中断门定义的程序代码段时,会自动将eflags中的IF位设置成0,表示关闭中断,避免中断嵌套,陷阱门和中段门的区别就是它在进入该描述符定义的代码段是不会自动把IF位设置成0
5. CPU提供IDTR寄存器来保存中断描述符表的地址。CPU规定了IDTR的结构:第0~15位是表界限,16~47位是IDT的基地址
6. CPU接到中断向量号以后自动的将中断向量号乘以8(中断描述符是8字节),然后再与IDTR中存储的基址相加,所求地址便是中断描述符的地址。
7. CPU自动进行特权级检查,对于用户进程主动发起的中断请求,CPU会自动检查 CPL < 门描述符的DPL 且 CPL > 目标代码段描述符的DPL;如果是外部设备引起的中断,则只检查CPL < 目标代码段的DPL
8. 权限检查通过以后,CPU自动把目标代码段的选择子加载到cs,将目标代码段的偏移加载到eip。
9. 中断程序的返回是用iret指令,iret指令内部由CPU自动完成了从栈中自动弹出数据到cs/eip/eflags等,根据特权级是否改变,决定是否要恢复旧栈
10. 中断发生后,CPU会自动将eflags中的NT位和TF位置为0,TF位为0表示中断程序不能单步执行,NT位为0表示当前程序不是由于嵌套程序执行的,在iret时会用到这个地方判断当前iret是中断返回还是嵌套任务返回。
11. 当进入中断目标程序执行时,如果是有特权级变换(由低到高),则CPU自动按照顺序压入相关的数据: ss_old -> esp_old -> eflags -> cs_old -> eip_old。 在执行完中断程序返回时,会按照压入的逆序弹出数据到相应的寄存器。
中断机制哪些需要操作系统支持?
需要中断描述符表和中断向量号
中断的运行过程?