[windows内核]中断与异常处理

   日期:2024-12-26    作者:ar48j 移动:http://oml01z.riyuangf.com/mobile/quote/34238.html

详细解释在手册中的:

[windows内核]中断与异常处理

CHAPTER 6
INTERRUPT AND EXCEPTION HANDLING

也可以参考

《软件调试第二版:卷1硬件基础》 中的第3章 中断和异常
《WINDOWS内核原理与实现》中的5.2章中断与异常

一、中断

描述

  1. 中断通常是由CPU外部的输入输出设备(硬件)所触发的,供外部设备通知CPU“有事情需要处理”,因此又叫中断请求(Interrupt Request

  2. 中断请求的目的是希望CPU暂时停止执行当前正在执行的程序,转去执行中断请求所对应的中断处理例程(中断处理程序在哪有IDT表决定

  3. 80x86有两条中断请求线

    1. 可屏蔽中断线,称为INTR(Interrupt Require
    2. 非屏蔽中断线,称为NMI(NonMaskable Interrupt
  4. 假设没有中断这种机制,当一个的程序的代码为死循环时,其他的程序就没有机会执行了。

中断的本质:改变CPU的执行路线

可屏蔽中断

描述

  1. 在硬件级,可屏蔽中断是由一块专门的芯片来管理的,通常称为中断控制器
  2. 它负责分配中断资源和管理各个中断源发出的中断请求
  3. 为了便于标识各个中断请求,中断管理器通常用IRQ(Interrupt Request ) 后面加上数字来表示不同的中断,比如:在Windows中,时钟中断的IRQ编号为0,也就是IRQ0
时钟中断
  1. 时钟中断的编号为0,所在位置为
  2. ~分别对应~
  1. 如果自己的程序执行时不希望CPU去处理这些中断,可以
    1. 用CLI指令清空EFLAG寄存器中的IF位
    2. 用STI指令设置EFLAG寄存器中的IF位
  2. 硬件中断与IDT表中的对应关系并非固定不变的

参见:APIC(高级可编程中断控制器)在手册第三卷中
CHAPTER 10
ADVANCED PROGRAMMABLE
INTERRUPT CONTROLLER (APIC)

非可屏蔽中断
  1. 当非可屏蔽中断产生时,CPU在执行完当前指令后会里面进入中断处理程序
  2. 非可屏蔽中断不受寄存器中位的影响,一旦发生,CPU必须处理
  3. 非可屏蔽中断处理程序位于IDT表中的2号位置
二、异常

描述

异常通常是CPU在执行指令时检测到的某些错误,比如除0、访问无效页面等。

中断与异常的区别

  1. 中断来自于外部设备,是中断源(比如键盘)发起的,CPU是被动的
  2. 异常来自于CPU本身,是CPU主动产生的
  3. 虽然被称为“软件中断”,但其本质是异常
  4. 的位对无效。
异常处理

描述

无论是由硬件设备触发的中断请求还是由CPU产生的异常,处理程序都在IDT表

无处不在的缺页异常

缺页异常是操作系统中最常见的异常了
缺页异常的产生(例举两种

  1. 当的时会发生缺页异常
  2. 当的属性为只读但程序试图写入时会发生缺页异常
  1. 若一个物理页是有效的,那么的位一定为1
  2. 当其他进程的物理页发生紧缺(不够用)时,但当前线性地址是有效的(指向了这个物理页,那么操作系统就会把这个物理页的内容保存到文件里,再将这个物理页挂到别人的中供其使用,最后将当前进程指向这个物理页的线性地址的的位改为0
  3. 再次访问这个线性地址时,操作系统发现位为0,便会进入号中断处理程序
  4. 进入后,若操作系统发现、、,而其他位都是有值的时候就说明当前物理页被存储到了页面文件里页面文件的位置(编号)保存在中
  5. 操作系统找到页面文件后,把里面的内容从文件中再次读到物理页,并将位改回1

说明:
整个过程对于用户来说是完全不可见的,用户并不知道发生了一个异常,只知道程序能够对地址进行正确的读写,但其实这个过程中可能有大量异常在发生
操作系统通过这种异常的方式节省大量物理页,当我们的程序在执行时,这种缺页异常时时刻刻在发生

例2:

  1. 当一个线性地址的属性为只读,但试图往里
  2. CPU检测到了这个异常,但CPU没有权利处理,便进入号中断处理程序,由操作系统来接管
  3. 操作系统检测出用户的操作确实是没有权限的,便会返回一个错误,内存访问异常
分析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内核原理与实现》


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号