详细解释在手册中的:
CHAPTER 6
INTERRUPT AND EXCEPTION HANDLING
也可以参考
《软件调试第二版:卷1硬件基础》 中的第3章 中断和异常
《WINDOWS内核原理与实现》中的5.2章中断与异常
一、中断
描述:
-
中断通常是由CPU外部的输入输出设备(硬件)所触发的,供外部设备通知CPU“有事情需要处理”,因此又叫中断请求(Interrupt Request)
-
中断请求的目的是希望CPU暂时停止执行当前正在执行的程序,转去执行中断请求所对应的中断处理例程(中断处理程序在哪有IDT表决定)
-
80x86有两条中断请求线:
- 可屏蔽中断线,称为INTR(Interrupt Require)
- 非屏蔽中断线,称为NMI(NonMaskable Interrupt)
-
假设没有中断这种机制,当一个的程序的代码为死循环时,其他的程序就没有机会执行了。
中断的本质:改变CPU的执行路线
可屏蔽中断
描述:
- 在硬件级,可屏蔽中断是由一块专门的芯片来管理的,通常称为中断控制器
- 它负责分配中断资源和管理各个中断源发出的中断请求
- 为了便于标识各个中断请求,中断管理器通常用IRQ(Interrupt Request ) 后面加上数字来表示不同的中断,比如:在Windows中,时钟中断的IRQ编号为0,也就是IRQ0
时钟中断
- 时钟中断的编号为0,所在位置为
- ~分别对应~
- 如果自己的程序执行时不希望CPU去处理这些中断,可以:
- 用CLI指令清空EFLAG寄存器中的IF位
- 用STI指令设置EFLAG寄存器中的IF位
- 硬件中断与IDT表中的对应关系并非固定不变的,
参见:APIC(高级可编程中断控制器)在手册第三卷中
CHAPTER 10
ADVANCED PROGRAMMABLE
INTERRUPT CONTROLLER (APIC)
非可屏蔽中断
- 当非可屏蔽中断产生时,CPU在执行完当前指令后会里面进入中断处理程序
- 非可屏蔽中断不受寄存器中位的影响,一旦发生,CPU必须处理
- 非可屏蔽中断处理程序位于IDT表中的2号位置
二、异常
描述:
异常通常是CPU在执行指令时检测到的某些错误,比如除0、访问无效页面等。
中断与异常的区别:
- 中断来自于外部设备,是中断源(比如键盘)发起的,CPU是被动的
- 异常来自于CPU本身,是CPU主动产生的
- 虽然被称为“软件中断”,但其本质是异常
- 的位对无效。
异常处理
描述:
无论是由硬件设备触发的中断请求还是由CPU产生的异常,处理程序都在IDT表
无处不在的缺页异常
缺页异常是操作系统中最常见的异常了
缺页异常的产生(例举两种):
- 当的时会发生缺页异常
- 当的属性为只读但程序试图写入时会发生缺页异常
- 若一个物理页是有效的,那么的位一定为1
- 当其他进程的物理页发生紧缺(不够用)时,但当前线性地址是有效的(指向了这个物理页),那么操作系统就会把这个物理页的内容保存到文件里,再将这个物理页挂到别人的中供其使用,最后将当前进程指向这个物理页的线性地址的的位改为0
- 再次访问这个线性地址时,操作系统发现位为0,便会进入号中断处理程序()
- 进入后,若操作系统发现、、,而其他位都是有值的时候,就说明当前物理页被存储到了页面文件里,页面文件的位置(编号)保存在中
- 操作系统找到页面文件后,把里面的内容从文件中再次读到物理页,并将位改回1
说明:
整个过程对于用户来说是完全不可见的,用户并不知道发生了一个异常,只知道程序能够对地址进行正确的读写,但其实这个过程中可能有大量异常在发生
操作系统通过这种异常的方式节省大量物理页,当我们的程序在执行时,这种缺页异常时时刻刻在发生
例2:
- 当一个线性地址的属性为只读,但试图往里写时
- CPU检测到了这个异常,但CPU没有权利处理,便进入号中断处理程序(),由操作系统来接管
- 操作系统检测出用户的操作确实是没有权限的,便会返回一个错误(,内存访问异常)
分析IDT表中0x2号中断的执行流程
打开IDA,下载好对应的符号文件
我这里静态分析的是ntkrnlpa.exe不过他们都是加载的同一个符号文件ntkrpamp.pdb,至于不同的内核文件的区别简单来说,是同一套源代码根据编译选项的不同而编译出四个可执行文件,分别用于:
ntoskrnl - 单处理器,不支持PAE
ntkrnlpa - 单处理器,支持PAE
ntkrnlmp - 多处理器,不支持PAE
ntkrpamp - 多处理器,支持PAE
先看IDA中的反汇编
WRK-v1.2源码对比
异常处理函数在
base toskei386 rap.asm
ReactOS 0.4.15源码
分析IDT表中0x8号中断的执行流程
IDA反汇编
WRK-v1.2源码对比
异常处理函数在
base toskei386 rap.asm
ReactOS 0.4.15源码
通过这几处对比,我们发现ReactOS 和IDA反汇编出来的还是有些不相同的,但是我们可以主要参考它的主要逻辑和设计思想,虽然ReactOS 自己说自己和windows没有半毛钱关系,但是大家都懂的。
而WRK中的源码和IDA反汇编中分析出来的基本相同,大家可以参考WRK中的详细注释和自己的分析来总结IDT表中0x2/0x8号中断的执行流程,这里由于本人比较菜就不写出自己的分析了,各位大佬自由发挥吧.
ReactOS源码查看网站
https://doxygen.reactos.org/index.html
WRK-v1.2很多地方都能找到,这里不贴出来了
WRK的参考可以去看前面说到的
《WINDOWS内核原理与实现》