IF标志位与中断的关系

在Linux中,中断分类如下:
中断分类

但Linux系统中只有一个中断向量表,所以,在中断类型与中断向量表里中断号的关系如下:

中断向量号 中断内容 中断类型 中断描述符类型
0(0x0) 除出错 Fault 陷阱门
1(0x1) 调试 Fault/Trap 陷阱门
2(0x2) NMI中断 Nonmaskable 陷阱门
3(0x3) 断点 Trap 系统调用门
4(0x4) 溢出 Trap 系统调用门
5(0x5) 边界范围超出 Fault 系统调用门
6(0x6) 无效操作码 Fault 陷阱门
7(0x7) 设备不存在 Fault 陷阱门
8(0x8) 双重出错 Abort 陷阱门
9(0x9) 协处理器段超越 Fault 陷阱门
10(0xA) 无效的任务状态段 Fault 陷阱门
11(0xB) 段不存在 Fault 陷阱门
12(0xC) 堆栈段错误 Fault 陷阱门
13(0xD) 一般保护错误 Fault 陷阱门
14(0xE) 页面错误 Fault 陷阱门
15(0xF) 保留 陷阱门
16(0x10) 浮点错误 Fault 陷阱门
17(0x11) 对齐检查 Fault 陷阱门
18(0x12) 机器检查 Fault 陷阱门
19(0x13) SIMD浮点异常 Fault 陷阱门
20-31 保留 陷阱门
32(0x20) 时钟中断 Maskable 中断门
33(0x21) 键盘中断 Maskable 陷阱门
34(0x22) 连接从芯片 Maskable 陷阱门
35(0x23) 串行口2 Maskable 中断门
36(0x24) 串行口1 Maskable 中断门
37(0x25) 并行口2 Maskable 陷阱门
38(0x26) 软盘驱动器 Maskable 陷阱门
39(0x27) 并行口1 Maskable 陷阱门
40(0x28) 实时钟中断 Maskable 陷阱门
41(0x29) 保留 Maskable 陷阱门
42(0x2A) 保留 Maskable 陷阱门
43(0x2B) 保留 Maskable 陷阱门
44(0x2C) 鼠标口中断 Maskable 陷阱门
45(0x2D) 数学协处理器 Maskable 陷阱门
46(0x2E) 硬盘中断 Maskable 中断门
47(0x2F) 保留 Maskable 陷阱门
128(0x80) 系统调用 系统调用门


上表给出的中断描述符类型参考Linux 0.11中的代码。后续Linux版本可能把0x20-0x2f的中断都设为了中断门。

中断门和陷阱门的区别,就在于他们对标志寄存器EFLAGS中的中断允许标志位IF的影响。由中断门描述符执行的中断会复位IF标志(IF=0);而通过陷阱门执行的中断不会影响IF标志。
IF标志复位可以避免其他中断干扰当前中断的处理,而随后的中断结束指令iret会从堆栈上恢复IF标志的原值(IF=1)。
而在代码中,汇编指令cli可以清除IF标志(IF=0),汇编指令sti可以设置IF标志(IF=1)。

经过上述描述,可以看到,如果在软件中清除了IF标志,那么肯定不会触发中断门的中断,那么此时会不会影响陷阱门的中断呢?
根据《Linux内核完全注释》,“EFLAGS中的IF标志不能屏蔽使用INT指令从软件中产生的中断”,“IF标志并不影响发送到NMI引脚的非屏蔽中断,也不影响处理器产生的异常”。

这说明清除IF标志后,可以触发陷阱门的中断(即异常)。

阅读更多
文章标签: linux 中断 IF标志位
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭