资讯动态

保护模式下的中断体系

发布时间:2026/8/19 8:18:05 来源:尧图企业网站定制
保护模式下的中断体系中断源64位模式下的中断源根据触发方式的不同主要可以分为三大类外部硬件中断External Hardware Interrupts、内部异常Internal Exceptions 和 软件触发中断Software-Generated Interrupts。外部硬件中断这些中断由CPU外部的硬件设备如键盘、鼠标、硬盘、网卡、定时器等发出用于通知CPU需要处理I/O事件。它们主要分为两类可屏蔽硬件中断 (Maskable Hardware Interrupts)这是最常见的外部中断。它们通过CPU的INTR引脚或本地APIC高级可编程中断控制器传递。这类中断可以通过设置EFLAGS寄存器中的IF中断允许标志位来统一屏蔽或开启。操作系统通过APIC等中断控制器管理这些中断的优先级和分发。不可屏蔽中断 (Non-Maskable Interrupt, NMI)这是最高优先级的外部中断之一。它通过CPU专用的NMI引脚触发无法被IF标志位屏蔽。NMI通常用于报告最关键、最紧急的硬件错误如严重的内存校验错误Machine Check。内部异常这些中断是CPU在执行指令时由于检测到错误条件如除零、访问非法内存地址而自动触发的。软件触发中断这类中断由软件通过执行特定指令主动发起常用于系统调用等场景。APCIAPIC高级可编程中断控制器是x86架构从单核走向多核时代的关键技术。它采用分布式、模块化的设计思想彻底解决了老式8259 PIC控制器在多处理器系统中无法有效分配中断的瓶颈。其核心组成分为本地APICLAPIC与I/O APICIOAPIC两大部分理解它们的协作是掌握APIC架构的关键。本地APIC (LAPIC)本地APIC是集成在CPU内部的中断处理核心每个逻辑处理器包括超线程都拥有自己独立的LAPIC。核心功能接收并处理中断接收来自I/O APIC的外部设备中断、处理器间中断(IPI)以及内部产生的时钟中断等。发送处理器间中断(IPI)一个CPU可以通过自己的LAPIC向其他CPU发送IPI用于任务调度、同步等。关键特征唯一ID每个LAPIC拥有一个唯一的APIC ID作为其在系统中的总线地址用于中断路由和IPI寻址。寄存器接口xAPIC模式寄存器通过内存映射I/O (MMIO)方式访问。x2APIC模式寄存器通过模型特定寄存器 (MSR)访问性能更高。I/O APIC (IOAPIC)I/O APIC是独立于CPU的芯片位于系统总线上相当于一个中断路由器。一个系统中可以有多个I/O APIC。核心功能负责接收所有外部硬件设备如键盘、网卡的中断信号并根据配置将其路由到指定的一个或多个LAPIC。关键特征多输入线通常提供24条以上的中断输入线IRQ远超8259 PIC的15个。中断重定向表 (Redirection Table)这是其最核心的部分。它是一个包含多个表项的表格每个表项对应一个IRQ输入并可独立编程指定该中断要发送到哪个或哪些CPU、使用哪个中断向量号以及触发方式等。工作原理当一个硬件设备需要服务时中断的处理流程如下设备触发硬件设备在其相连的I/O APIC的某个IRQ线上产生一个中断信号。I/O APIC查表I/O APIC根据该IRQ号查询其中断重定向表获取预配置的路由信息如目标CPU、中断向量号等。生成中断消息I/O APIC根据路由信息生成一个中断消息Interrupt Message。发送至LAPIC该消息通过APIC总线老系统或系统总线现代系统发送到目标CPU的LAPIC。LAPIC接收并转发目标LAPIC收到消息后将其转换为一个传统的中断请求传递给它所属的CPU核心。CPU响应CPU核心响应中断根据中断向量号查询IDT执行相应的中断处理程序。从xAPIC到x2APICxAPIC是Pentium 4和Xeon时代的基础APIC架构。x2APIC是xAPIC的扩展主要为了解决大规模多核系统中的性能和可扩展性问题。主要优势支持更多CPU将APIC ID从8位扩展到32位理论上可支持多达2³²-1 (约40亿)个处理器。性能提升使用MSR接口访问寄存器比MMIO更快。增强特性改进了中断交付机制和可靠性。总的来说APIC系统通过将中断管理功能分散到每个CPU的LAPIC和系统级的I/O APIC中实现了高效、灵活且可扩展的中断处理是现代多核x86系统能够高效运行的基石。IDT取代了实模式下的IVT保存了中断处理程序的地址该表基址由IDTR指定。IDT中的表项被称为门描述符中断门、陷阱门、任务门位 (Bit)大小字段名描述0-1516位Offset 15..0中断处理程序入口地址的低16位。16-3116位Segment Selector段选择子指定中断处理程序所在的代码段必须为64位代码段。32-398位IST中断栈表Interrupt Stack Table。低3位用于选择TSS中的IST条目0表示不使用IST其余位为0。40-478位Type Attributes类型和属性。包含P存在位、DPL描述符特权级、Type类型如中断门0xE或陷阱门0xF等。48-6316位Offset 31..16中断处理程序入口地址的中16位。64-9532位Offset 63..32中断处理程序入口地址的高32位。96-12732位Reserved保留字段必须为0。中断栈表 ISTISTInterrupt Stack Table中断栈表是x86-64架构的一项硬件特性旨在为特定、关键的中断事件自动切换到预定义的、独立的内核栈。它的核心价值在于提升系统的可靠性与健壮性尤其是在处理可能导致系统崩溃的严重错误如#DF双重故障或不可屏蔽中断NMI时。IST的工作流程如下配置操作系统在任务状态段TSS 中预先定义好最多7个独立的栈。每个栈的大小都可以不同。关联在中断描述符表IDT 中为特定的中断门Interrupt Gate设置一个非零的IST索引值。触发当该中断发生时CPU硬件会自动执行以下操作读取IDT中对应的IST索引。根据索引从TSS中找到对应的IST栈顶指针。自动将栈切换到该IST栈然后才执行中断处理程序。在64位模式下TSS不再用于硬件任务切换其主要职能之一就是为IST提供存储空间。64位TSS的格式中包含一个专门用于存放7个IST栈指针的数组Interrupt Stack Table [u64; 7]。IST每个表项的大小为64位8字节其内容就是一个指向栈的数据指针。IST的最大表项数为7索引号为17。红色方框中的就是处理中断时需要切换的栈中断处理流程当一个中断发生时CPU会遵循以下步骤进行处理以32位为例获取中断向量号CPU根据中断来源外部硬件、软件int指令或内部异常获取一个0-255的数字即中断向量号。定位IDT描述符CPU使用IDTR寄存器中的IDT基地址加上“中断向量号 × 8”的偏移量找到对应的门描述符。执行权限检查CPU会检查当前特权级CPL是否大于或等于数值上小于等于目标门描述符的特权级DPL以确保当前程序有权限使用这个中断门。对于内部中断和外部中断具体的检查规则略有不同。获取处理程序地址权限检查通过后CPU从门描述符中提取出目标代码段的选择子并从GDT或LDT中找到对应的代码段描述符最终得到中断处理程序的基地址和偏移量。保护现场与跳转CPU会将当前程序的关键信息如SS、ESP、EFLAGS、CS、EIP等压入栈中保护起来。然后它会将CS和EIP设置为中断处理程序的地址开始执行。恢复现场中断处理程序执行完毕后会执行iret或iretd指令。该指令会从栈中弹出之前保存的信息恢复到被中断前的状态继续执行原程序。上面说的是32位处理器的中断处理流程64位的更简单了因为64位下IDT中是没有任务门的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价