可嵌套中断服务程序内的几个步骤分别是:
1、中断响应的事前准备:
系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都知道得很清楚,才能正确地响应各种中断信号和异常。
2、CPU检查是否有中断/异常信号:
CPU在执行完当前程序的每一条指令后,都会去确认在执行刚才的指令过程中中断控制器(如:8259A)是否发送中断请求过来,如果有那么CPU就会在相应的时钟脉冲到来时从总线上读取中断请求对应的中断向量。
3、根据中断向量到IDT表中取得处理这个向量的中断程序的段选择符:
CPU根据得到的中断向量到IDT表里找到该向量对应的中断描述符,中断描述符里保存着中断服务程序的段选择符。
4、根据取得的段选择符到GDT中找相应的段描述符:
CPU使用IDT查到的中断服务程序的段选择符从GDT中取得相应的段描述符,段描述符里保存了中断服务程序的段基址和属性信息,此时CPU就得到了中断服务程序的起始地址。
5、CPU根据特权级的判断设定即将运行的中断服务程序要使用的栈的地址:
CPU会根据CPL和中断服务程序段描述符的DPL信息确认是否发生了特权级的转换,比如当前程序正运行在用户态。
而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的首地址存在TR寄存器中)里取得该程序的内核栈地址。
6、保护当前程序的现场:
CPU开始利用栈保护被暂停执行的程序的现场:依次压入当前程序使用的eflags,cs,eip,errorCode(如果是有错误码的异常)信息。
7、跳转到中断服务程序的第一条指令开始执行:
CPU利用中断服务程序的段描述符将其第一条指令的地址加载到cs和eip寄存器中,开始执行中断服务程序。这意味着先前的程序被暂停执行,中断服务程序正式开始工作。
8、中断服务程序处理完毕,恢复执行先前中断的程序:
在每个中断服务程序的最后,必须有中断完成返回先前程序的指令,这就是iret(或iretd)。程序执行这条返回指令时,会从栈里弹出先前保存的被暂停程序的现场信息,即eflags,cs,eip重新开始执行。
中断服务程序流程是:
1、保护现场:保护现场有两个含义,其一是保存程序的断点;其二是保存通用寄存器和状态寄存器的内容。
2、中断服务(设备服务):这是中断服务程序的主体部分,对于不同的中断请求源,其中断服务操作内容是不同的。
3、恢复现场:这是中断服务程序的结尾部分,要求在退出服务程序前,将原程序中断时的“现场”恢复至原来的寄存器中。
4、中断返回:中断服务程序的最后一条指令通常是–条中断返回指令,使其返回到原程序的断点处,以信继续执行原程序。