.中断和异常.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
中断和异常

Win32下的中断和异常 作者:Matt Pietrek 你可能感觉一切都好。但当你写了一些新代码并运行它时才知道你被感觉欺骗了!又出现了 令人烦恼的访问违规(Access Violation)。你可能也看到了那个令人害怕的代码 0xC0000005, 也就是 STATUS_ACCESS_VIOLATION。0xC0000005 是如何表示“刚刚出错了”的,以及 Win32®是 如何支持不同类型的异常的,这些并不为很多人所知。在本月的专栏中,我要挖掘Win32 下的异 常以及它们是如何与硬件异常相关联的。在讨论硬件时主要针对的是 Intel x86平台。 如果你曾经为 Windows® 3.x 编写过程序或者编写过 MS-DOS® extender,你一定遇到过 0xD 这个异常(一般保护性错误,简称为 GPF)。你也可能看到过其它错误,例如非法指令错误(异 常 6)。这些代码并不是人工赋予的。任何 Intel手册上都说过,这些异常代码是 CPU 用来通知 各种问题或事件用的。在Win32 中你看不到这些代码,因为Windows® NT,这个Win32 操作系统 家族的旗舰产品,被设计运行于多种平台上。它没有简单地让Alpha或 MIPS 版本的 Windows NT 使用Intel CPU 的异常代码。 相反,Win32使用它自己的一套代码系统来表示各种异常。在任何给定的Win32 平台上,系 统把相应的CPU 的异常代码映射到一个或多个通用的 Win32异常代码上。例如,Intel CPU上的 异常代码 0xD可能变成 STATUS_ACCESS_VIOLATION(0xC0000005)。同样,异常代码 0xD 也可能 变成Win32的 STATUS_PRIVILEGED_INSTRUCTION(0xC0000096)异常。底层的硬件异常决定了它 应该被映射到哪个Win32 异常上。 让我们从 CPU 异常和中断出发,开始我们的 Win32 异常之旅。异常(Exception)和中断 (Interrupt)是一种手段, 当正在执行代码时 CPU 通过它切换到一个完全不同的代码路径上以 处理一些外部的刺激或条件。中断通常是由外部的刺激引起的,例如按下了一个键。而异常则是 代码或数据中的条件导致处理器生成的。CPU试图读取一个没有物理内存映射到的地址时会产生 异常,这是最经典的一个异常的例子。 Intel CPU 保留了32 个中断/异常号以处理各种情形。图1 是一些常用的代码。它们中很多 意义很清楚,但是还有很多你没有遇到过(至少是在运行本专栏的样例程序之前)。MS-DOS 上 的老手可能奇怪竟然列出的 INT 5H不是打印屏幕,INT 8H 也不是计时器中断。这是为什么?图 1 的描述是 Intel对异常和中断的定义。但不幸的是,在 Intel迅猛发展之前,MS-DOS 的作者已 经把其中的一些中断号用作其它用途。结果导致当程序员使用BOUND指令时竟然意外到得到了屏 幕的输出内容! 图 1:Intel 定义的异常和中断 代码 定义 00 除法错 01 调试异常(单步和硬件调试) 02 不可屏敝中断(NMI) 03 断点中断 04 溢出中断(INTO) 05 越界中断 06 非法指令 07 协处理器不可用 08 异常嵌套 0A 非法任务状态段(TSS) 0B 段不存在 0C 堆栈错误 0D 一般保护性错 0E 页错误 为了简单起见,本专栏以下的部分中我就用异常来代表异常或中断。就像我前面说的,中断 和异常在技术上是不同的。另外,异常可以被进一步分成故障(Fault)、自陷(Trap)和终止 (Abort)。我不想在这里对它们做详细描述,你可以简单地认为它们是一样的。 当异常发生时,CPU 挂起当前的执行路径,把控制权交给异常处理程序。CPU 把标志寄存器 (EFLAGS)、代码段寄存器(CS)、指令指针寄存器(EIP)压入堆栈以保护当前的执行状态。 接着,根据异常代码查找事先设计好的处理这个异常的程序的地址,并把控制权转交给它。实际 上,异常代码就是中

文档评论(0)

rovend + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档