上一篇文章我们模拟操作系统的加载器程序,使用汇编语言实现了一个程序加载器:点击链接查看上一篇文章:程序加载器的实现原理
本篇文章,是实模式学习的结尾。在经过了那么多坎坷,终于学完了8086的实模式!!!最重要的是本篇文章没有汇编代码,只讲原理~~ 今天的内容比较简单,学习一下中断的原理-包括硬中断和软中断。主要理解以下内容:
- 硬中断的工作原理
- 软中断的工作原理
- 中断向量表
1、硬中断
硬中断一般是外部硬件中断-就是从处理器外部来的中断信号。
当外部设备发生错误或者有数据要传送时,或者处理器交给它的任务处理完了,它都会向处理器发送信号,高速处理器。
如下图,外部硬件中断是通过两个信号线引入处理器内部的。这两根线的名字恩别叫做NMI和INTR
当一个中断发生时,处理器将会通过中断引脚NMI和INTR得到通知。除此之外,处理器还需要知道发生了什么,以便采取适当的处理措施。
每种类型的中断都被统一编号,这称为中断类型号、中断向量或者中断号。
1.1 非屏蔽中断(不可屏蔽中断)
NMI接收的是不可屏蔽中断。
不可屏蔽中断的中断号统一为2(因为所有不可屏蔽中断都几乎是致命的无法解决,所以处理器干脆不处理的,统一将他们的中断号令为2,处理器接收到2号中断时直接放弃继续正常工作,也不会试图纠正已经发生的错误。)。
1.2 可屏蔽中断
和NMI不同,INTR一般接收的是可屏蔽中断。大多数的中断也是可屏蔽中断。
INTR接收可屏蔽中断。
Intel处理器允许有256个中断。中断号是0~255。如下图是一个中断控制器,它管理传送来的中断信号,决定是否将中断传送给CPU。
以上两个8259芯片负责15个中断号的管理。注意这里为什么是15个而不是256个呢?其实是每次它管理的中断号不一样的,这一次可能管理的是10-25号,下次可能管理的是其他的号。
那么在哪里屏蔽中断或者不屏蔽中断呢?实际上有两个位置,一个是8259内部,一个是处理器内部。
**8259内部:**在8259内部有一个中断屏蔽寄存器,这是个8位寄存器,对应着该芯片的8个输入引脚,对应的位是0还是1决定了该引脚输入的中断是否能通过8259芯片。0表示允许 1表示阻断
**处理器内部:**除了要看8259内部,最终还要看处理器。处理器内部的标志寄存器FLAGS有一个标志IF。这是中断标志。当IF为0时所有从INTR来的中断都被忽略。当IF为1时处理器可以接收和相应中断。
1.3、实模式下中断向量表
所谓中断处理,就是处理器要执行一段与该中断有关系的程序(指令)。处理器可以识别256个中断,那么理论上就需要256个中断程序。
这些程序的实际位置并不重要,重要的是,在实模式中,处理器要求将它们的入口点(还记得程序的入口点么?不记得话看上一篇文章)集中存放到内存中的从物理地址0x00000处(0x0000:0x0000)到0x003ff处(0x0000:0x03ff)。共1KB的内存空间。这就是所谓的中断向量表。
如下图是实模式下的中断向量表:
中断信号来自哪个引脚,8259芯片是最清楚的,所以他会把相应的中断号告诉处理器,处理器拿着这个中断号,要顺序做以下几件事:
-
保护断点的现场
- 首先将FLAGS寄存器压栈,然后清楚它的IF位(防止在中断的时候被打断,如果想要有嵌套中断,可以在编写中断处理程序时适时使用sti指令开放中断)
- 然后依次将CS于IP寄存器压栈
-
执行中断处理程序
- 由于处理器已经拿到了中断号,它用中断号乘以4(见上图)就得到了该中断的入口点的偏移地址和段地址
- 接着将得到的段地址与偏移地址传送给CS和IP
-
返回到断点接着执行
- 所有中断的程序的最后是一条iret指令。这将导致处理器一次从栈中弹出IP CS FLAGS的原始内容,于是转到主程序继续执行
- 由于中断处理程序返回时已经将FLAGS内容恢复,所以IF标志位也恢复。也就是说可以接收新的中断
2、软中断
和硬件中断不同,软中断是处理器内部产生的。是由执行指令引起的。
软中断是由int指令引起的。这类中断不需要中断识别总线周期,中断号在指令中给出。
更详细的内容,可以见我另一篇博客:中断的概念与意义
3、总结
今天学会了以下内容:
- 硬中断
- 软中断
- 中断向量表的概念与意义
笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。
学习探讨加个人:
qq:1126137994
微信:liu1126137994