:I/O中断处理过程包括哪几个阶段?中断服务程序流程分为哪几部分?

完整的中断处理过程分为

1)中断响应的事前准备:

系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都知道得很清楚,才能正确地响应各种中断信号和异常。

2) CPU检查是否有中断/异常信号

CPU在执行完当前程序的每一条指令后,都会去确认在执行刚才的指令过程中中断控制器(如:8259A)是否发送中断请求过来,如果有那么CPU就会在相应的时钟脉冲到来时从总线上读取中断请求对应的中断向量。

对于异常和系统调用那样的软中断,因为中断向量是直接给出的,所以和通过IRQ(中断请求)线发送的硬件中断请求不同,不会再专门去取其对应的中断向量。

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重新开始执行。

中断服务程序流程

保护现场

保护现场有两个含义,其一是保存程序的断点;其二是保存通用寄存器和状态寄存器的内
容。前者由中断隐指令完成(详见8.4.4节),后者由中断服务程序完成。具体而言,可在中断
服务程序的起始部分安排若干条存数指令,将寄存器的内容存至存储器中保存,或用进栈指令
(PUSH)将各寄存器的内容推入堆栈保存,即将程序中断时的“现场”保存起来。

2.中断服务(设备服务)

这是中断服务程序的主体部分,对于不同的中断请求源,其中断服务操作内容是不同的,例
如,打印机要求CPU将需打印的一行字符代码,通过接口送人打印机的缓冲存储器中(参见图
573)以仕打印机打印又如,显示设各要求CPU将需显示的一屏字符代码通过接口送人显示
5.23)以供打印机打印。又如,显示设备要求CPU将需显示的一屏字符代码通过接口送入显示
器的显示存储器中(参见图5.18)。

3.恢复现场

这是中断服务程序的结尾部分,要求在退出服务程序前,将原程序中断时的“现场”恢复至
原来的寄存器中。通常可用取数指令或出栈指令(POP),将保存在存储器(或堆栈)中的信息这
回到原来的寄存器中。

4.中断返回

中断服务程序的最后一条指令通常是–条中断返回指令,使其返回到原程序的断点处,以信
继续执行原程序。
计算机在处理中断的过程中,有可能出现新的中断请求,此时如果CPU暂停现行的中断月
务程序,转去处理新的中断请求,这种现象称为中断嵌套,或多重中断。倘若CPU在执行中断月
务程序时,对新的中断请求不予理睬,这种中断称为单重中断。这两种处理方式的中断服务程戶
略有区别。图5.43(a)和图5.43(b)分别为单重中断和多重中断服务程序流程。比较图5.4
()和图5.43(h)可以发现.其区别在千“开中断”的设置时间不同。

你可能感兴趣的:(杂七杂八)