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)串行口2Maskable中断门
36(0x24)串行口1Maskable中断门
37(0x25)并行口2Maskable陷阱门
38(0x26)软盘驱动器Maskable陷阱门
39(0x27)并行口1Maskable陷阱门
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标志后,可以触发陷阱门的中断(即异常)。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值