中断和异常
概念
硬件中断 由外围硬件设备发出的中断信号引发的
中断
软中断 是由int n 指令引发的中断处理
异常
异常就是16位汇编语言中说的内部中断,由处理器内部产生的中断,表示在指令执行过程中遇到的错误的状况,也叫异常或异常中断。
中断与异常发生时,处理器将挂起正在执行的过程或任务,然后执行中断和异常处理程序
中断与异常的发生时随机的不可预测的。
实模式下的中断
在实模式下,利用中断向量表,位于内存最低端的1KB内存,定义了256种中断的入口地址,由BIOS进行初始化(返回)。内容包括16为段地址和16位段内偏移量。
当产生中断时,对应中断号在中断向量表中找到中断程序的入口地址,然后执行中断程序。
访问过程:
①获得中断号,中断号×4KB
②在中断向量表中找到中断程序入口地址
③执行中断程序
保护模式下的中断
不再有中断向量表,取而代之的是中断描述表(IDT),由48位的中断描述表寄存器(IDTR)指向中断描述符表,所以IDT保存位置不固定。中断描述符表包括不同种的描述符,中断门、陷阱门、任务门。
中断门与陷阱门只能存放在IDT中,而任务门能存放在IDT、GDT、LDT中。
访问过程:
①中断向量×8,访问IDT
②找到对应的描述符
③是中断门或陷阱门描述符(先不讨论任务门,可以看最下面的补充)
当描述符是任务门时,处理的不是简单的中断处理程序,而是任务切换。
④获取其中的选择子,访问GDT或者LDT
⑤从中在获得目标段的描述符,从中得到目标段基地址
⑥基地址与门描述符中的偏移量相加的到中断处的程序的32位线性地址
⑦若未开启分页,线性地址就是物理地址
若开启分页,以一级页表为例。
线性地址高20位作为页表索引号,索引号×4+偏移地址(线性地址低10 位)得到此页表的物理地址。
为了访问内存中的数据,也就现将段选择子加载到段寄存器DS、ES等中
补充:
1、描述符高速缓冲器的工作流程
直接使用段寄存器的高速缓冲寄存器,从中获得线性地址,同指令寄存器EIP中的内容相加,共形成32位的物理地址从内存中读取下一条指令
2、为了访问内存中的数据,也就现将段选择子加载到段寄存器DS、ES等中
3、当发生无法返回的异常时,可以利用任务门描述符,利用任务切换,切换到内核任务,将发生异常的任务从内存中抹去,回收内存空间。
好处:
①被中断的那个程序或任务的状态保存到TSS中
②由于接管了一个新的任务,因此可以使用一个全新的0特权级栈,凡是当前0特权级栈遭到破坏而系统崩溃
③切换到新的任务,有独立的内存空间
缺点:
过程复杂,需要保存大量的段状态,并且需要检查特权级,速度慢。
Tips:调用门用于访问高特权级,而任务门一般用于任务的切换
也就是调用门一般是段内转移,而任务门就是段间转移