异常的任务门处理

基础知识

IA-32 CPU把异常分为3类:错误(fault)、陷阱(trap)和中止(abort)。

中断是由硬件引起的,而异常是由软件引起。陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的。陷阱处理程序提供的服务为当前进程所用,而中断处理程序提供的服务则不是为了当前进程的。

中断是计算机系统中非常宝贵的资 源。如果为某个设备分配了中断资源,那么便赋予了它随时打断CPU的权力。中断和异常的根本差异是:异常来自于CPU本身,是CPU主动产生的;而中断来自于外部设备,是中断源发起的,CPU是被动的。

商业软件有时会用异常的陷阱来进行软件跟踪,但是消耗太大。

异常处理程序在执行完一系列 检查和预处理后,会调用__except块的过滤表达式,并期望得到以下3个值之一:
EXCEPTION_CONTINUE_EXECUTION (–1) : 导致异常的问题已经解决,在异常出现的现场重新执行操作。
EXCEPTION_CONTINUE_SEARCH (0) :当前__except语句不能处理该异常,通知操作系统继续搜寻该线程其他的异常处理程序。
EXCEPTION_EXECUTE_HANDLER (1):当前__except语句识别该异常,通过执行__except的复合语句来处理该异常。然后执行__except复合语句之后的代码。

Windows系统中的TSS个数并不是与系统中的线程个数相关的,而是与CPU个数相关的。在启动期间,Windows会为每个CPU创建3~4个TSS,一个用于处理NMI,一个用于处理#DF异常,一个处理机器检查异常(与版本有关,在XP SP1中存在),另一个供所有Windows线程所共享。当Windows切换线程时,它把当前线程的状态复制到共享的TSS中。也就是说,普通的线程切换并不会切换TSS,只有当NMI或#DF异常发生时,才会切换TSS,这就是所谓的以软件方式切换线程(任务)。

IDT的每个表项是一个所谓的门描述符(Gate Descriptor)结构。之所以这样称呼,是因为IDT表项的基本用途就是引领CPU从一个空间到另一个空间去执行,每个表项好像是一个从一个空间进入到另 一个空间的大门(Gate)。在穿越这扇门时CPU会做必要的安全检查和准备工作。

IDT可以包含以下3种门描述符。
任务门(task-gate)描述符:用于任务切换,里面包含用于选择任务状态段(TSS)的段选择子。可以使用JMP或CALL指令通过任务门来切换到任务门所指向的任务,当CPU因为中断或异常转移到任务门时,也会切换到指定的任务。
中断门(interrupt-gate)描述符:用于描述中断处理例程的入口。
陷阱门(trap-gate)描述符:用于描述异常处理例程的入口。

在这里插入图片描述
系统通过门描述符的类型字段,即高4字节的8~12位(共5 位),来区分一个描述符的种类。例如任务门的类型是0y00101(y 代表二进制数),中断门的类型是0y0D110,其中D位用来表示描述的是16位门(0)还是32位门(1),陷阱门的类型是0y0D111。

NT(Nested Task flag)任务嵌套标志,为1时表示当前任务是链接到前面执行的任务的,通常是由于中断或异常触发了IDT表中的任务门。

本文讨论的使用任务门机制处理的异常共三种情况:
DF异常,Double Fault异常,是指在处理异常的过程中又发生了异常
代表紧急任务的不可屏蔽中断(NMI)
代表严重硬件错误的机器检查异常(MCE)

实操

IDTR寄存器中存放着IDT表的位置。
在这里插入图片描述
当然也可以使用!Idt -a命令查看具体表项和数值,这和PChunter看到的结果是一样的。
在这里插入图片描述
dg命令显示段选择值,段选择子为0x50。类型和Long都能看出是32位寄存器,Gran表示粒度为Byte字节,大小限制为0x68字节。
在这里插入图片描述
TSS段基址为0x83f36000,#DF异常对应的门描述符所指向的TSS段,是位于内存地址0x83f36000开始的0x68个字节。
在这里插入图片描述
IA-32 CPU的TSS段格式。注意下图中的右数字图标是十进制。
在这里插入图片描述
通过ln命令搜索与EIP值接近的符号

在这里插入图片描述
结论就是呢,任务门最终会调用KiTrap08函数进行处理。

参考文献
《软件调试2》

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摔不死的笨鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值