当前位置: 首页 > news >正文

phpstudy建设网站教程网站快捷导航ie怎么做

phpstudy建设网站教程,网站快捷导航ie怎么做,备案网站的黑名单,微信公众号怎么做文章推广异常 CPU异常记录 CPU的异常基本围绕这几个点展开 异常记录异常分发异常处理 异常产生后,首先要记录异常信息(异常的类型、异常发生的位置等),然后要寻找异常的处理函数,我们称为异常的分发,最后找到异常…

异常


CPU异常记录

CPU的异常基本围绕这几个点展开

  • 异常记录
  • 异常分发
  • 异常处理

异常产生后,首先要记录异常信息(异常的类型、异常发生的位置等),然后要寻找异常的处理函数,我们称为异常的分发,最后找到异常处理函数并调用,我们称为异常处理

CPU异常的产生

CPU检测到异常 -> 查IDT表执行中断处理函数 -> CommonDispatchException -> KiDispatchException

异常的分类

  1. CPU产生的异常(除零异常)
  2. 软件模拟产生的异常(由高级语言C++,JAVA等throw抛出的异常)

Windows的异常代码

Windows 常见的 IDT 相关异常

中断号名称触发原因
0x00#DE (Divide Error)除零错误
0x06#UD (Invalid Opcode)非法指令
0x0D#GP (General Protection Fault)内存访问越权
0x0E#PF (Page Fault)页错误(访问无效内存)
0x2D#BP (Breakpoint)int 3 断点

在这里插入图片描述
但是处理异常并不是_KiTrap00这个函数去处理的,而是由CommonDispatchException(我这里是KiDispatchTrapException表示这个异常是由硬件触发的)处理

在这里插入图片描述
在这里插入图片描述

CommonDispatchException结构体

type struct _EXCEPTION_RECORD{DWORD ExceptionCode,		// 异常代码DWORD ExceptionFlags,		// 异常状态struct _EXCEPTION_RECORD *ExceptionRecord,	// 下一个异常PVOID ExceptionAddress,		// 发生异常的地址DWORD NumberParameters,		// 附加参数个数ULONG _PTR ExceptionInformation,[EXCEPTION_MAXIMUM_PARAMETERS]		// 附加参数指针
}

模拟异常记录

模拟代码

#include <iostream>void test() {// 模拟抛出异常throw 1;
}int main() {test();system("pause");return 0;
}

在这里插入图片描述

当我们使用软件模拟去调用异常时的调用链

CxxThrowException -> RaiseException(Kernel32.dll) -> NTDLL.DLL!RtlRaiseException() -> NTDLL!NtRaiseException -> NT!KiRaiseException

在这里插入图片描述

软件模拟异常和CPU异常的不同点

  1. 在CPU异常中都有对应的一个值(异常代码),而在软件模拟异常中这个值和当前的编译环境有关(在当前的编译环境中这个值是固定的)
  2. ExceptionAddress中存储的值是_RaiseException的地址,而CPU异常中存储的是异常的地址

总结:

  • CPU异常
    1. CPU检测到错误
    2. 查IDT表,执行中断处理函数
    3. CommonDispatchException(填充ExceptionRecord结构体)
    4. KiDispatchException
  • 模拟异常
    1. throw关键字(依赖编译器)
    2. CxxThrowException
    3. NTDLL.DLL!RtlRaiseException(填充ExceptionRecord结构体)
    4. NTDLL!NtRaiseException
    5. NT!KiRaiseException
    6. KiDispatchException

内核异常的处理流程

用户异常与内核异常

发生在用户空间的就是用户异常,发生在内核空间的就是内核异常

无论是CPU异常还是模拟异常,是用户层还是内核层异常,都要通过KiDispatchException函数进行分发,理解好这个函数是学好异常的关键

KiDispatchException执行流程

  1. _KeContextFromKframes 将Trap_frame备份到context为返回3环做准备
  2. 判断先前模式 0内核调用,1用户层调用
  3. 判断是否是第一次调用
  4. 判断是否有内核调式器
  5. 如果没有或者内核调试器不处理
  6. 调用RtlDispatchException
  7. 如果返回FALSE
  8. 再次判断是否有内核调试器,没有和有调用不处理就直接蓝屏

用户异常的分发

异常如果发生在内核层,处理就比较简单,因为异常处理函数也在0环,不用切勿堆栈,但是如果异常发生在3环,就意味着必须要切换堆栈,回到3环执行处理函数

KiDispatchException执行流程

  1. _KeContextFromKframes 将Trap_frame备份到context为返回3环做准备
  2. 判断先前模式 0是内核调用,1是用户层调用
  3. 判断是否是次一次调用
  4. 判断是否有内核调式器
  5. 发送给3环调试器
  6. 如果3环调式器没有处理这个异常 修正EIP为KiUserExceptionDispatcher
  7. KiDispatchException函数执行结束
    • CPU异常:CPU检测到异常 -> 查IDT执行处理函数 -> CommonDispatchException -> KiDispatchException通过IRETD返回3环
    • 模拟异常:CxxThrowException -> RaiseException -> RtlRaiseException -> NT!NtRaiseException -> NT!KiRaiseException -> KiDispatchException 通过系统调用返回3环
  8. 无论通过哪种方式,线程再次回到3环时,将执行KiUserExceptionDispatcher
http://www.dtcms.com/a/403776.html

相关文章:

  • 网站颜色字体颜色网站建设宀金手指花总十五
  • 毕赤酵母(K. phaffii)番茄红素细胞工厂构建:材料方法详解与关键技术细节
  • SpringCloud项目阶段八:利用redis分布式锁解决集群状态下任务抢占以及实现延迟队列异步审核文章
  • 广州seo网站多少钱河北邯郸seo网站建设网站优化
  • 湘潭市建设路学校网站国内最新新闻事件今天
  • .NET MVC 框架基础大全
  • 系统性学习C++-第一讲-C++入门基础
  • MySQL笔记9
  • 【算法】day5 二分查找
  • 2016年做网站好不好上海百姓网
  • 什么是推免生?具备哪些条件才能保研成功?
  • 11. Linux 防火墙管理
  • 江苏专业网站建设公司电话手机淘宝官网首页
  • 百度 如何 关键字 网站域名 关联网站loading动画效果
  • 【大模型LLM面试合集】有监督微调_微调
  • 网站的广告语应该怎么做临海外发加工网
  • MySQL-主从复制
  • 杭州 网站设计制作怎么把图片做超链接到网站
  • 深度学习与大脑的关系是“模拟-验证-超越”的迭代循环
  • 05 初始化
  • Python print()函数详解
  • 2025 PHP7/8 实战入门:15 天精通现代 Web 开发——第 5 课:数组与字符串处理
  • 网站底部放什么wordpress免费主题 开源
  • 时态--10--现在完成进⾏时
  • 新手建站网站内做动图
  • 超越工具链整合:价值流智能时代的企业级DevOps平台选型之道
  • LLMs之ThinkingModel:DeepSeek-V3.1的简介、安装和使用方法、案例应用之详细攻略
  • 数组(Java基础语法)
  • Linux驱动:操作步骤
  • 刚体转动欧拉方程:从理论到卫星姿态控制的实践