中断向量是指早期的
微机系统中由硬件产生的中断入口地址或存放
中断服务程序的首地址。中断是指在计算机
执行程序的过程中,当出现异常情况或者特殊请求时,计算机停止现行的程序的运行,转而对这些
异常处理或者特殊请求的处理,处理结束后再返回到现行程序的中断处,
继续执行原程序。
中断服务程序的入口地址。在某些计算机中,中断向量的位置存放一条跳转到中断服务程序入口地址的
跳转指令。
在
PC/AT中由硬件产生的中断
标识码被称为
中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、
CPU自动形成等),即在
中断响应期间
8259A产生的是当前请求中断的最高优先级的
中断源的中断类型号。中断类型号和中断向量之间有下面的关系:
在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所提供的中断服务功能。
当Intel CPU运行在32位保护模式下时,需要使用中断描述符表(Interrupt Descriptor Table,
IDT)来管理中断或异常。IDT是
Intel 8086~80186 CPU中使用的中断向量表的直接替代物。其作用也类似于中断向量表,只是其中每个中断描述符项中除了含有
中断服务程序地址以外,还包含有关
特权级和描述符类别等信息。
Linux操作系统工作于80x86的保护模式下,因此它使用
中断描述符表中断向量表各个地址表示的中断用途。