IF标志位与中断的关系
2016-05-05 23:04
197 查看
在Linux中,中断分类如下:
但Linux系统中只有一个中断向量表,所以,在中断类型与中断向量表里中断号的关系如下:
上表给出的中断描述符类型参考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系统中只有一个中断向量表,所以,在中断类型与中断向量表里中断号的关系如下:
中断向量号 | 中断内容 | 中断类型 | 中断描述符类型 |
---|---|---|---|
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) | 系统调用 | 系统调用门 |
中断门和陷阱门的区别,就在于他们对标志寄存器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标志后,可以触发陷阱门的中断(即异常)。
相关文章推荐
- Jenkins+cocoapods+pgy+多版本 持续集成
- linux命令(13):kill/killall命令
- iOS代码加密常用加密方式
- 组合or继承
- R树空间索引
- 《夺权野兽朱棣》
- 读《程序员的自我修养 —— 静态链接》乱摘
- Vim快速入门
- java面试题
- android 6.0 permission exception Can only use lower 8 bits for requestCode
- XML的约束技术DTD语法
- GDB 使用教程
- 数据结构实验之链表四:有序链表的归并
- 第十一周总结
- FatMouse' Trade hdu1009(贪心)
- linux命令(12):ping命令
- Android开发转型公司技术负责人是一种怎样的体验
- string函数的面试题分析
- HTML5再炎
- linux命令(11):df命令