- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)压入堆栈以保护当前的执行状态。
接着,根据异常代码查找事先设计好的处理这个异常的程序的地址,并把控制权转交给它。实际
上,异常代码就是中
您可能关注的文档
最近下载
- 国家安全教育大学生读本高教2024版课件-第九章筑牢其他各领域国家安全屏障-.pptx VIP
- TCSGPC-水库库岸边坡变形监测技术规程.pdf VIP
- 雅思基础入学测试题(参考).pdf VIP
- 遗体防腐整容之遗体消毒——化学法消毒遗体.pptx VIP
- 中国古代文学史魏晋南北朝文学教学优质课件.pptx VIP
- 2025年北京银行招聘考试(行政能力测验)历年参考题库含答案详解(5卷).docx VIP
- 昭和ロマンス(昭和罗曼史,岸部真明)吉他弹奏图曲谱.pdf VIP
- 【2025秋】人教版三年级数学上册教学计划(及进度表).docx
- 2025年杭州银行招聘考试(行政能力测验)历年参考题库含答案详解(5卷).docx VIP
- 第十一章 遗体防腐常用器械.ppt VIP
文档评论(0)