中断向量
中断服务程序的入口地址
中断向量是指一组中断源与一组中断服务程序入口地址的一一对应关系,包括中断服务程序的段基址CS和偏移地址IP。
CPU响应中断时通过中断响应信号选通中断接口,这一过程为向量中断,也称矢量中断。中断接口将中断向量号送至数据总线,CPU通过它获知中断程序入口地址,转去执行该中断服务程序。在向量中断中,每个中断服务程序都有一个确定的入口地址,该地址称为中断向量。
概念介绍
中断标识码(中断类型号):由硬件(通常是中断控制器)产生,以标识不同的中断源。
中断向量:中断服务程序的入口地址。在某些计算机中,中断向量的位置存放一条跳转到中断服务程序入口地址的跳转指令。
中断向量地址:存储中断向量的存储单元地址
中断
存放
存放中断服务程序的入口地址
来存放中断向量(共256个),称这一片内存区为中断向量表,地址范围是0~3FFH,如图所示。
PC/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、CPU自动形成等),即在中断响应期间8259A产生的是当前请求中断的最高优先级的中断源的中断类型号。中断类型号和中断向量之间有下面的关系:
中断类型号×4=存放中断子程序首地址的存储区首地址=中断向量地址
有了存放中断向量的首地址,从该地址开始的4个存储单元中取出的就是中断服务程序的入口。
跳转
跳转到中断服务程序的入口地址
在AVR或ARM微处理器中,中断向量的大小也是4个字节,但其中存放的不是中断程服务程序的入口地址,而是可执行的代码。当响应中断时,硬件自动执行相应中断向量处的跳转代码,然后跳转到具体的中断服务程序的入口地址。
向量表
CPU是根据中断号获取中断向量值,即对应中断服务程序的入口地址值。因此为了让CPU由中断号查找到对应的中断向量,就需要在内存中建立一张查询表,即中断向量表(在32位保护模式下该表称为中断描述符表)。80x86微机支持256个中断,对应每个中断需要安排一个中断服务程序。在 80x86实模式运行方式下,每个中断向量由4字节组成。这4字节指明了一个中断服务程序的段值和段内偏移值。因此整个向量表的长度为1KB。当 80x86微机启动时,ROM BIOS中的程序会在物理内存开始地址0x0000:0x0000处初始化并设置中断向量表,而各中断的默认中断服务程序则在BIOS中给出。由于中断向量表中的向量是按中断号顺序排列,因此给定一个中断号N,那么它对应的中断向量在内存中的位置就是0x0000:N×4,即对应的中断服务程序入口地址保存在物理内存0x0000:N×4位置处。
在BIOS执行初始化操作时,它设置了两个8259A芯片支持的16个硬件中断向量和BIOS提供的中断号为0x10~0x1f的中断调用功能向量等。对于实际没有使用的向量则填入临时的亚中断服务程序的地址。以后在系统引导加载操作系统时会根据实际需要修改某些中断向量的值。例如,对于DOS操作系统,它会重新设置中断0x20~0x2f的中断向量值。而对于Linux,除了在刚开始加载内核时需要用到BIOS提供的显示和磁盘读操作中断功能,在内核正常运行之前则会在setup.s程序中重新初始化8259A芯片并且在head.s程序中重新设置一张中断向量表(中断描述符表)。完全抛弃了BIOS所提供的中断服务功能。
英特尔 CPU运行在32位保护模式下时,需要使用中断描述符表(Interrupt Descriptor Table,IDT)来管理中断或异常。IDT是Intel 8086~80186 CPU中使用的中断向量表的直接替代物。其作用也类似于中断向量表,只是其中每个中断描述符项中除了含有中断服务程序地址以外,还包含有关特权级和描述符类别等信息。Linux操作系统工作于80x86的保护模式下,因此它使用中断描述符表来设置和保存各中断的"向量"信息。下面是80X86中断向量表各个地址表示的中断用途。
中断向量地址和中断向量
中断向量:中断服务程序的入口地址
中断向量地址:内存中存放中断服务程序入口地址的地址
参考资料
..2024-03-21
..2024-03-21
..2024-03-21
目录
概述
概念介绍
中断
存放
跳转
向量表
参考资料