Windows 中断异常管理

前言

本文参考 张银奎.《软件调试》一书,融入了自己的理解,以及将逻辑用伪代码形式表达

1. 中断和异常管理

前言:系统调用所提供的服务是在内核里。一般是在系统空间实现,而应用软件则都在用户空间运行。它们之间有着明确的间隔。实质是CPU运行模式的不同

通过一条int 0x2e的指令可以让CPU陷入内核。

1.1 IDT、IDTR、PCR、PCRB等背景知识

IDT: 中断描述符表寄存器

IDTR:中断描述符表寄存器 ----- 寄存器的LIDT\SIDT操作必须是ring0

PCR:处理器控制区

PCRB:处理器控制块

IDT表的初始化过程。IDT的最初建立和初始化工作是windows加载程序(NTLDR\WinLoad)在实模式下完成的

  1. 在准备好内存后,加载程序先执行CLI指令关闭中断处理,然后执行LIDT指令将IDT的位置和长度加载到CPU中。
  2. 加载程序将CPU从实模式切换到保护模式,并将执行权移交给NT内核入口函数KiSystemStartup.
  3. 接下来,内核中的处理器初始化函数会通过SIDT指令取得IDT表的信息,对其进行必要的调整。
  4. 以参数形式传递给KiInitializePcr函数,后者将其记录到描述处理器的基本数据区PCRPCRB

​ 以上的过程发生在0号处理器中,也就是多为的BootstrpProcessor – BSP,即使是多CPU系统,在NTLDR或WinLoad即执行权移交给内核阶段都只有BSP运行,BSP会执行KestartupAllProcessors函数来初始化其他CPU。简称AP,对于每个Cpu KeStartupProcessors函数会为其建立单独的处理器状态去包括IDT表,然后调用KiInitProcessor函数,后者会根据BSP的IDT初始化AP的IDT并作相应的更改

1.2 门描述符背景知识

IDT 表每个表项都有一个所谓的门描述符(Gate Descriptor)结构。这样称呼的原因是引领CPU从一个空间到另一个空间的大门(Gate),CPU在此之前会做必要的安全检查和准备工作。

IDT表中可以包含以下三种门描述符(每个描述符8个字节):

在这里插入图片描述

  • 任务门(task-gate):用于任务切换,里面包含用于选择任务状态段(TSS)的段选择子。可以使用 JMP 或 CALL 指令来通过任务们来切换任务,当CPU因为中断或异常要转移任务的时候,也会切换到指定的任务。

  • 中断门(interrupt-gate):用于描述中断处理例程的入口。

  • 陷阱门(trap-gate):用于描述异常处理例程的入口。

    大多数中断和异常都是利用中断们或陷阱们来处理的:

    1. 首先,CPU会根据门描述符的段选择子定位到段描述符,
    2. 然后进行一系列检查,如果检查通过后,CPU就判断是否进行切换栈。如果目标代码的特权级比较高(数值小),那么CPU就需要切换栈,其方法就是从当前任务状态段TSS中读取新堆栈的段选择子SS和堆栈指针ESP,并将其加载到SS和ESP中,
    3. 然后,CPU会把中断过程的旧的SS指针和ESP指针压入新的堆栈 。

    • 然后把EFLAGS、CS、EIP等压入栈

    • 如果发生异常,那么把错误码也压入栈。

      如果特权级别一样,就不需要进行堆栈的切换,但是任然需要前面中间的两步

      • TR寄存器存放的是指向当前任务TSS段的段选择子,使用WinDBG可以观察TSS的内容

1.3 异常的描述和登记

​ 为了更好的管理异常,windows系统定义了专门的数据结构来描述异常,并定义了一系列代码来标识典型的异常。

除了CPU产生异常,还能通过软件方式产生异常,比如:RaiseException而产生的异常和使用编程语言的throw关键字抛出的异常。

即: 异常包括了 — CPU 异常软件异常

EXCEPTION_RECORD结构

windows 使用EXCEPTION_RECORD来描述异常:

typedef struct_ EXCEPTION_RECORD (
	DWORD ExceptionCode;//异常代码
	DWORD ExceptionFlags;//异常标志
	struct_ EXCEPTION RECORD* ExceptionRecord;//相关的另一个异常
	PVOID ExceptionAddress ;//异常发生地址,比如int 3 ;那就是 int 3的地址,而不是下一条;
 						//对于硬件而言,根据异常类型不同可能是导致异常的那条指令的地址,获知								是导致异常指令的下一条地址
	DWORD NumberParameters;//参數数组中的元素个数,即ExceptionInfomation数组中包含的有效草书个数,注: 最多允许 15个附加参数。
	ULONG_ PTR Except ionInformation [EXCEPTION MAXIMUM PARAMETERS]; //参数数组
} EXCEPTION RECORD, * PEXCEPTION RPCORD;

 
 
  • 其中ExceptionCode为异常代码,是一个32位的整数,其格式是Windows系统的状态代码格式,在在NtStatus.h中包含了已经定义的所有状态代码,WinBase.h中可以看到异常代码只是状态代码的别名,比如:
#define EXCBPTION BREAKPOINT   STATUS_BREAKPOINT
#define EXCEPTION_SINGLE STEP  STATUS_SINGLE STEP

1.3.1 登记CPU异常

对于CPU异常,KitTrapXX例程在完成对本异常动作后,通常会调用**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值