异常向量和异常向量表

一、异常向量

1、定义

异常向量(Exception Vector)是处理器架构中用于识别和处理不同类型异常的一个机制。每个异常类型都有一个唯一的异常向量,处理器通过该向量确定如何处理特定的异常。

2、作用

  1. 识别异常类型:每种异常类型都有一个唯一的异常向量编号,这有助于处理器识别当前发生的异常是什么类型。
  2. 定位异常处理程序:处理器可以根据异常向量找到对应的异常处理程序的地址。异常处理程序是专门设计来处理特定类型异常的代码段。
  3. 异常优先级管理:某些架构中,异常向量还可以用于确定异常的优先级,以便在多个异常同时发生时,处理器可以优先处理更重要的异常。

二、异常向量表

异常发生时,处理器必须执行与异常相对应的处理程序代码。内存中存储处理程序的位置称为异常向量。在ARM架构中,异常向量存储在一个表中,称为异常向量表

每个异常级别都有自己的向量表,即EL3、EL2和EL1各有一个向量表。(EL0除外)该表包含要执行的指令,而不是一组地址。这些通常是将核心引导到完整异常处理程序的分支指令。

向量表中的每个条目有 16 个指令长(在 ARMv7-A 和 AArch32 中,每个条目只有 4 个字节)。这意味着在AArch64中,顶级处理程序可以直接写入向量表中。

基地址由 VBAR_EL n给出,每个条目都有一个距该基地址的定义偏移量。每个表有 16 个条目,每个条目的大小为 128 字节(32 条指令)。该表实际上由 4 组 4 个条目组成。使用哪个条目取决于几个因素:

·异常类型(SError、FIQ、IRQ 或同步)
·如果在同一异常级别发生异常,则要使用的堆栈指针(SP0 或 SPn)
·如果在较低的异常级别发生异常,则为下一个较低级别(AArch64 或 AArch32)的执行状态。

<think>好的,用户现在问的是中断向量表异常向量表,我需要先确认这两个概念的定义、区别以及它们在计算机系统中的作用。用户之前已经了解过中断异常的区别,所以可能需要更深入的解释,特别是关于它们的处理机制。 首先,中断向量表(IVT)异常向量表(EVT)都是用来管理不同类型事件的机制。中断通常由外部硬件触发,而异常由CPU内部执行指令时产生。它们的处理程序地址存储在对应的向量表中,这样当事件发生时,CPU可以快速找到对应的处理程序。 接下来需要明确两者的结构。中断向量表在早期的x86系统中是固定的内存地址,比如实模式下的0x0000到0x03FF,每个中断号对应4字节的入口地址。而异常向量表可能更复杂,因为异常类型更多,处理方式也不同。不过在某些架构中,比如ARM异常向量表可能包含不同的异常类型,如复位、未定义指令、软件中断等,每个入口指向特定的处理代码。 需要区分不同架构下的实现差异。比如x86ARM在中断异常处理上有不同的机制,可能影响向量表的结构。用户可能对具体架构的例子感兴趣,所以应该举一些常见的例子,比如x86的IVTARM异常向量表。 还要注意用户可能的误区,比如是否所有异常都有对应的向量表条目,或者中断异常是否共享同一个向量表。例如,在x86中,中断异常共享同一个向量表,而某些架构可能分开。需要指出这些细节,避免混淆。 另外,用户可能想知道向量表是如何被初始化使用的。操作系统在启动时通常会设置这些向量表,将处理函数的地址填入相应位置。比如,BIOS在实模式下初始化IVT,而现代操作系统在保护模式或长模式下使用IDT。 最后,需要总结两者的异同,强调中断向量表处理外部异步事件,异常向量表处理内部同步事件,但具体实现因架构而异。可能还要提到现代系统中IDT(中断描述符表)这样的高级结构,以展示技术的发展。 在回答时要保持结构清晰,分点说明,使用表格或示例帮助理解。同时,注意用户的技术背景,可能需要避免过于专业的术语,或者适当解释术语,确保内容易于理解。</think>### **中断向量表(Interrupt Vector Table, IVT)与异常向量表(Exception Vector Table, EVT)** 中断向量表异常向量表是计算机系统中用于管理**中断****异常**的核心数据结构,它们定义了不同事件(如硬件中断、程序错误)发生时 CPU 应跳转执行的处理程序地址。以下是两者的详细对比说明: --- ### **1. 基本概念** | **特性** | **中断向量表(IVT)** | **异常向量表(EVT)** | |------------------|-------------------------------------------|-------------------------------------------| | **用途** | 存储**硬件中断**对应的处理程序入口地址 | 存储**异常**对应的处理程序入口地址 | | **触发源** | 外部硬件设备(如键盘、定时器、磁盘) | CPU 内部指令执行错误或特殊事件(如除零、缺页) | | **架构依赖性** | 不同 CPU 架构实现不同(如 x86、ARM) | 通常与中断向量表共用(x86)或独立(ARM) | --- ### **2. 结构与工作流程** #### **中断向量表(IVT)** - **位置**: - **x86 实模式**:固定在内存地址 `0x0000:0x0000` 到 `0x0000:0x03FF`(共 256 项)。 - **x86 保护模式**:由**中断描述符表(IDT)**替代,位置由操作系统动态设置。 - **表项结构**: - 每个表项占 **4 字节**(实模式),包含中断处理程序的 **段地址:偏移地址**。 - 例如:键盘中断(IRQ1)对应向量号 `0x09`,处理程序地址存储在 `0x0000:0x0024`。 - **工作流程**: 1. 硬件触发中断(如键盘按下)。 2. CPU 根据中断号(向量号)查中断向量表,获取处理程序入口地址。 3. 保存当前上下文(如寄存器、程序计数器),跳转执行中断服务程序(ISR)。 4. ISR 处理完成后,恢复上下文,返回原程序继续执行。 #### **异常向量表(EVT)** - **位置**: - **x86**:与中断向量表共用同一张表(IDT),通过向量号区分中断异常。 - **ARM**:独立异常向量表,固定在地址 `0x00000000` 或 `0xFFFF0000`(高地址向量表)。 - **表项结构**: - 每个表项指向一个异常处理程序(如除零异常、缺页异常)。 - 例如:ARM 中复位异常向量位于 `0x00000000`,缺页异常向量位于 `0x0000000C`。 - **工作流程**: 1. CPU 执行指令时触发异常(如访问非法内存)。 2. 根据异常类型查异常向量表,获取处理程序入口地址。 3. 保存上下文,跳转执行异常处理程序。 4. 处理程序可能修复错误(如缺页异常分配内存),或终止进程(如段错误)。 --- ### **3. 关键区别** | **维度** | **中断向量表(IVT)** | **异常向量表(EVT)** | |------------------|-------------------------------------------|-------------------------------------------| | **事件类型** | 处理外部硬件事件 | 处理 CPU 内部错误或特殊请求 | | **表项独立性** | 独立或与异常共用(x86 IDT) | 可能独立(ARM)或共用(x86) | | **触发时机** | 异步(随时可能发生) | 同步(由当前指令触发) | | **典型表项示例** | - IRQ0(时钟中断)<br>- IRQ1(键盘中断) | - 除零异常向量号 0)<br>- 缺页异常向量号 14) | --- ### **4. 架构差异** #### **x86 架构** - **统一使用 IDT**: - 中断异常共用**中断描述符表(IDT)**,每个表项定义权限、处理程序地址等。 - 例如: ```asm ; 定义除零异常向量号 0)的处理程序 lidt [idtr] ; 加载 IDT 寄存器 idtr: dw idt_end - idt - 1 ; IDT 大小 dd idt ; IDT 基地址 idt: ; 向量号 0(除零异常) dw divide_error_handler ; 处理程序偏移低16位 dw 0x08 ; 代码段选择子(内核模式) db 0 ; 保留 db 0x8E ; 类型:中断门(DPL=0) dw divide_error_handler >> 16 ; 处理程序偏移高16位 ``` #### **ARM 架构** - **独立异常向量表**: - 异常向量表固定在低地址,每个表项对应特定异常类型: | **地址** | **异常类型** | |----------------|---------------------------| | `0x00000000` | 复位(Reset) | | `0x00000004` | 未定义指令(Undefined Instruction)| | `0x00000008` | 软件中断(SWI,系统调用) | | `0x0000000C` | 预取中止(Prefetch Abort) | | `0x00000010` | 数据中止(Data Abort) | | `0x00000014` | 保留 | | `0x00000018` | IRQ 中断 | | `0x0000001C` | FIQ 快速中断 | --- ### **5. 实际应用场景** #### **中断向量表应用** - **键盘输入处理**: 1. 用户按下键盘,触发 IRQ1 中断。 2. CPU 查中断向量表,跳转到键盘中断处理程序。 3. 处理程序读取键盘缓冲区,将按键传递给操作系统。 #### **异常向量表应用** - **缺页异常处理(虚拟内存)**: 1. 程序访问未映射的虚拟地址,触发缺页异常。 2. CPU 查异常向量表,跳转到缺页处理程序。 3. 操作系统分配物理页,更新页表,重新执行触发异常的指令。 --- ### **6. 常见误区** 1. **误区:中断异常向量表完全独立** - **修正**: - 在 x86 中,中断异常共用 IDT(中断描述符表),通过向量号区分。 - 在 ARM 中,异常向量表是独立的,但 IRQ 中断也属于异常向量表的一部分。 2. **误区:向量表由应用程序直接修改** - **修正**: - 向量表通常由操作系统内核初始化,用户程序无法直接修改(需特权级权限)。 3. **误区:所有异常都会终止程序** - **修正**: - 如缺页异常可由操作系统修复,程序继续执行;段错误等严重异常才会终止程序。 --- ### **总结** - **中断向量表**:管理外部硬件中断,表项指向中断服务程序(ISR)。 - **异常向量表**:管理 CPU 内部异常,表项指向异常处理程序(如修复错误或终止进程)。 - **核心区别**: - 中断是异步事件,异常是同步事件。 - x86 中两者共用 IDT,ARM异常向量表独立。 - **关键作用**:通过向量表快速定位处理程序,保证系统可靠性实时响应。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值