实模式和保护模式中断机制的简单对比与一点硬件细节

来源:互联网 发布:php curl get传递参数 编辑:程序博客网 时间:2024/06/11 13:41
    和实模式相比,保护模式下的中断处理有两点最大的区别。首先,中断向量表可以在内存中自由浮动。其次,中断的功能获得了拓展。
    在实模式下,中断向量表占据内存最低的1KB,共256个表项。每个表项4子节,包含一个2子节的段地址和2子节的偏移,即中断处理程序的入口地址。但是在保护模式下,中断向量表可以在内存中自由浮动。就像GDT被GDTR指向一样,中断向量表被IDTR(Interrupt Descriptor Table Register,中断描述符表寄存器)指向。该表和GDT非常类似。首先,GDTR和IDTR在格式上完全相同,均包含一个32bit的基地址和16bit的界限。相比之下,CPU中的另外两个关键寄存器LDTR和TR则表现出了相似性,都是16bit大小,分别包含指向LDT和TSS的选择子。从表项上来看,除了指出中断处理程序的目标地址(16bit选择子和32bit偏移)外,IDT表项还为了进行特权级检测而加入的DPL域。此外,IDT表项还包含一个P比特。
    实模式下,中断的处理过程很单一。当中断被触发时,CPU保护现场,跳转中断处理程序,执行完毕后恢复现场,继续执行原程序。但是,在保护模式下,中断的处理过程呈现出了多样化。中断处理过程因IDT中的描述符而异,可以分为三类。如果IDT描述符是一个TSS描述符,那么中断会引发任务切换。这种机制使得多任务轮询调度成为可能。如果IDT描述符是一个中断门描述符或者陷阱门描述符,则执行类似于实模式的中断跳转。但是中断门和陷阱门差别不大。



8259A: 关于中断的一点硬件细节
    8259A,也就是中断控制器,负责辅助外设向CPU提供申请中断处理。
    8259A向外提供8个引脚,IR(Interrupt Request)0-7,用于连接外设,也就是说,一个8259A可以提供8个中断。粗略的说,当8259A通过IR0-7获知有外设请求中断时,会通过CPU的INTR引脚告知CPU。然后通过和CPU的ITRA(Interrupt Aknowledgement)、数据总线的交互,8259A告知CPU中断向量号。之后,CPU开始处理中断。
    常见的应用情况是2片8259A级联。从片的INT引脚接在主片的IR1上,从而允许两个芯片共同提供15个中断。
    8259A的一个方便之处在于CPU可以对其进行灵活的编程,从而灵活的利用中断机制。首先,8259A本身对中断提供了优先级仲裁机制。不过,优先级并不是可编程得。但是为了支持高优先级的中断去“打断”低优先级的中断,芯片拥有一个寄存器ISR(Interrupt Service Register),每当8259A告知CPU中断号后,就将该中断号对应的ISR中的比特位置1,表示该中断正在被执行。然后,8259A就可以比较新来的中断请求和正在执行的中断服务,从而选择打断CPU,或者暂时不打断。直到CPU完成中断服务后,向8259A的某个端口(主片0x20,从片0xa0)发送所谓EOI指令(End of Interrupt)0x20,ISR中优先级最高的比特位才会被clear。当然,也可以通过控制字让芯片将中断向量号传递给CPU后主动将ISR清零。其次,CPU可以通过芯片的IMR(Interrupt Mask Register)选择性屏蔽中断。譬如连接在从片IR0上的RTC(实时钟电路)中断,在芯片初始化后是被屏蔽的,要想利用RTC产生周期性终端,必须改写从片的IMR。
    8259A是个麻烦的芯片。
0 0
原创粉丝点击