1. 中断机制与入口地址基础解析
在x86架构的实模式下,中断向量表(IVT)占据内存最低的1KB空间(0000:0000到0000:03FF),每个中断号对应4字节的入口地址(CS:IP)。但现代操作系统运行在保护模式下,这个机制发生了根本性改变:
- 实模式:直接通过IVT物理地址跳转
- 保护模式:通过中断描述符表(IDT)实现特权级检查和跳转
- 虚拟8086模式:需要模拟实模式行为
我曾用DOSBox调试一个老式数据采集卡驱动时,发现其依赖INT 13h的扩展功能,但在保护模式下直接读取IVT会得到错误地址。这个经历让我意识到理解现代环境下的中断处理机制至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实模式下的传统获取方法
2.1 直接读取IVT
最基础的方法是通过段寄存器计算物理地址:
assembly复制mov ax, 0
mov es, ax ; 段地址置0
mov bx, [es:13h*4] ; 偏移地址=中断号×4
mov dx, [es:13h*4+2] ; 获取CS值
注意:此方法仅在实模式下有效,在Windows/Linux等保护模式系统中会触发异常
2.2 通过DOS功能调用
DOS 21h中断的35h功能更安全:
assembly复制mov ah, 35h ; 功能号
mov al, 13h ; 中断号
int 21h ; 返回ES:BX=中断处理程序地址
实测发现,即使在DOS环境下,某些TSR程序会hook这个调用,返回的可能是过滤后的地址。
3. 保护模式下的现代解决方案
3.1 Windows平台实现
通过内核调试器获取IDTR寄存器:
cpp复制#include <windows.h>
#include <stdio.h>
#pragma pack(push, 1)
typedef struct _IDT_ENTRY {
USHORT OffsetLow;
USHORT Selector;
UCHAR IstIndex;
UCHAR TypeAttr;
USHORT OffsetMid;
ULONG OffsetHigh;
ULONG Reserve
