time 
设为首页】【收藏本站
当前位置: 主页 > Unix/Linux > Linux基础 > 兼容内核之二十六:Windows的结构化异常处理(第三部分)

兼容内核之二十六:Windows的结构化异常处理(第三部分)

时间:2010-07-02 22:02 点击:8870次 字体:[ ]




  前两篇漫谈介绍了在内核中怎样利用SEH机制和宏操作_SEH_TRY、_SEH_HANDLE、以及_SEH_END为可能引起异常的代码提供保护,以及在异常果真发生时的处理过程。读者现在对于SEH机制的原理应该已经有了一些了解。前面也曾提到,Windows操作系统在用户空间也提供了同样的功能,而且实现的方式也基本相同。但是,在前两篇漫谈中读者所看到的是当异常发生于系统空间时的情景,而并没有看到当异常发生于用户空间时怎样经过内核被提交到用户空间、并在那里得到处理的过程。

  我们知道,异常就像中断,不管是什么原因(“软异常”除外)所引起,一旦发生首先进入的是内核中的异常响应/处理程序的入口,这就是类似于KiTrap0()那样的底层内核函数,只是因为引起异常的原因不同而进入不同的入口,就像对于不同的中断向量有不同的入口一样。在内核中,仍以页面异常为例,正如读者已经看到,CPU会从KiTrap14()进入函数KiPageFaultHandler()。在那儿,如果所发生的并非如“缺页”或“写时复制(Copy-On-Write)”那样的“正常”异常,就要根据CPU在发生异常时所处的空间而分别调用KiKernelTrapHandler()或KiUserTrapHandler()。如果调用的是KiKernelTrapHandler(),就会顺着KPCR数据结构中的“异常(处理)队列”、即ExceptionList,依次让各个节点认领。如果被认领,就会通过SEHLongJmp()长程跳转到当初通过_SEH_HANDLE{}给定的代码中。这读者已经见到了。

  但是,如果异常发生于用户空间,受到调用的就是KiUserTrapHandler()。

  [_KiTrap14() > KiPageFaultHandler() > KiUserTrapHandler()]



本文地址 : http://www.fengfly.com/plus/view-182183-1.html
标签: 空间 兼容 调用 异常 用户 处理
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: