2024年3月9日发(作者:)

中断处理

每个cpu有一张中断表,简称IDT。

IDT的整体布局:【异常->空白->5系->硬】(推荐采用7字口诀的方式重点记忆)

异常:前20个表项存放着各个异常的描述符(IDT表不仅可以放中断描述符,还放置

了所有异常的异常处理描述符,0x00-0x13)

保留:0x14-0x1F,忽略这块号段

空白:接下来存放一组空闲的保留项(0x20-0x29),供系统和程序员自己分配注册使用

5系:然后是系统自己注册的5个预定义的软中断向量(软中断指手动的INT指令)

(0x2A-0x2E 5个系统预注册的中断向量,0x2A:KiGetTickCount,

0x2B:KiCallbaclReturn

0x2C:KiRaiseAssertion, 0x2D:KiDebugService, 0x2E:KiSystemService)

硬: 最后的表项供驱动程序注册硬件中断使用和自定义注册其他软中断使用

(0x30-0xFF)

下面是中断号的具体的分配情况:

0x00-0x13固定分配给异常:

0x14-0x1f:Intel保留给他公司将来自己使用(OS和用户都不要试图去使用这个号

段,不安全)

----------------------以下的号段可用于自由分配给OS、硬件、用户使用

-----------------------

linux等其他系统是怎么划分这块号段的,不管,我们只看Windows的情况

0x20-0x29:Windows没占用,因此这块号段我们也可以自由使用

0x2A-0x2E:Windows自己本身使用的5个中断号

0x30-0xFF:Windows决定把这块剩余的号段让给硬件和用户使用

参见《寒江独钓》一书P93页注册键盘中断时,搜索空闲未用表项是从0x20开始,

到0x29结束的,就知道为什么寒江独钓是在这段范围内搜索空白表项了(其实我们也完全

可以从0x14开始搜索)

Windows系统中,0x30-0xFF这块号段让给了硬件和用户自己使用。事实上,这块

号段的开头部分默认都是让给硬件IRQ使用的,也即是分配给硬件IRQ的。IRQ N默认映

射到中断号0x30+N,如IRQ0用于系统时钟,系统时钟中断号默认对应就是0x30。当然

程序员也可以修改APIC(可编程中断控制器)将IRQ映射到自定义的中断号。

IRQ对外部设备分配,但IRQ0,IRQ2,IRQ13必须如下分配:

IRQ0 ---->间隔定时设备