Linux在Windows下实现结构化的异常处理
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-04-09
由系统进行异常程序处理. 第二部代码如下:
拥有帝国一切,皆有可能。欢迎访问phome.net
第二部分代码的主要功能是确认发生异常的线程是否已经注册过异常处理例程(异常处理例程可以嵌套,即在某段代码注册了异常处理之后,它的子程序依旧可以注册异常处理例程,在发生异常时,将会执行最近注册的那个异常处理例程),如果没有注册,表示该异常由操作系统处理;而如果该线程注册过异常处理程序,则恢复现场并转到注册的异常程序入口执行. 同时在"_enum_exception_handler()函数搜索当前能够用当前线程是否已经注册过异常处理例程;如果有则返回在注册的一个异常处理例程的入口以及异常处理例程注册时的堆栈指针. pStackTop参数有异常服务程序的第一部分传入,指向异常发生后的栈顶.在IA32架构里,如果要发生异常时堆栈便产生有4种不同的变化状态,下例是异常发生时堆栈状态如图所示:
驱动时是在内核层运行,发生运行异常时不会有特权级转换,之(c)、(d)两种情况不用考虑,而对于GP而言,是肯定有错误码产生 ,只需要处理状态(b)格式的堆栈信息,把异常处理程序的入口地址写入堆栈中保存EIP的位置,然后清除错误码,再用IRETD或REIF指令返回就能转移到异常处理程序运行了.在第二段异常服务程序中修改返回地址是用:
第一宏用于注册异常处理程序,取得异常处理程序的入口地址(第4行:asm volatile("jmp 1fn");), 标号1定义在第二个宏中,其后就是异常处理程序,第二个宏的第5行(asm volatile ("1:t call 2bn");) 调用第一个宏中的标点号2,然后弹出堆栈第一个双字就得到了异常处理程序入口地址,将这个异常地址和当前堆栈指针入栈作为参数调用_except_register_handler函数一定要指定asmlinkage前缀以指明参数用堆栈传递,不然编译器肯定会用寄存器传递参数.注册完之后就进入到危险代码区了,然后在危险代码结束时,就来到第二个宏的第一句:asm volatile("jmp 3fn");跳转到说尾部分来取消当前注册的异常处理程序.这里我们注意的是三个宏之间多于出来的那两组花括号,这两组花括号绝对不能省略,它们会把危险的代码和异常处理程序标记为函数中相对独立的部分,以避免编译器在优化时将这两部分的代码和其他部分又化成一个整体(直接后果就是堆栈混乱).(以上是Linux在Windows下实现结构化的异常处理的全部过程) 拥有帝国一切,皆有可能。欢迎访问phome.net拥有帝国一切,皆有可能。欢迎访问phome.net |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 本文将实现Windows Linux的异构环境下一篇: Linux的计划任务
关于Linux在Windows下实现结构化的异常处理的所有评论