IA-32e模式下的异常处理
系统异常处理
CPU如果调用系统异常处理程序
需要的数据结构
- IDT_Table: 中断向量表, 在中断向量表中的每一项都是一个中断描述符(中断门或者陷阱门), 一个中断描述符中的几位是段选择符
- GDT或者LDT
处理过程(没有特权变化的情况),在处理中断和异常的时候, 需要处理程序, 注意: 是处理程序的代码, 每一个处理程序都要有的执行现场的保存工作
- 中断向量号 -> IDT -> 中断描述符 -> 段选择子 -> GDT/LDT -> 段描述符 -> 基地址, 同时得知中断描述符保存的段内偏移量 -> 中断处理程序(在开头最先执行的就是程序现场保留的工作, 在entry.S中完成, 在entry.S文件中定义了每一个寄存器在当前栈顶的偏移量, 用来在保留现场的时候将对应的寄存器的值放到对应的偏移量中, 这样方便恢复现场(恢复现场的程序也在entry.S中, 该文件中有一个模块(函数), 是将所有可用寄存器中的数据都压入到栈中))
处理过程(有特权变化的情况)
- CPU将EFLAGS, CS, EIP, Error Code都压入栈
注意
- 中断和异常向量都在一张IDT表中, IDT表总共256项
- IDT表的前32项都是异常向量, 但是21-31是Intel保留的不能使用, 所以我们实际上使用的是20个异常
- 我们已经在head.S程序的前半部分手动初始化了一下IDT(是不完整的初始化), 在head.S程序的后半阶段我们setup IDT表示, 给这256个异常和中断向量的异常处理程序都设置为同一个目标代码地址, 都是显示一串字符串"Error! Unknown interrupt or fault at RIP"
- 初始化完毕IDT之后, 紧接着我们要初始化TSS
真正进入到内核程度之后的系统异常处理
- 在trap.c文件中对每一个异常都提供一个异常处理函数(trap, interrupt, system)
- 在trap.c文件中, 使用set_trap_gate, set_intr_gate, set_system_gate三个函数为20个异常项提供处理函数, 处理函数名为nmi, divide_error, page_fault等, 他们都是在汇编层面上编写的, 因为C语言不能对寄存器进行栈操作, 在这些汇编函数中, 会调用各自的do_nmi, do_divide_error等子函数, 这些才是真正处理异常的逻辑封装, 是在C语言层面编写的, 主要就是编写do程序, 而nmi, divide_error的存在就是为了程序的现场恢复与保留等额外的处理
- 在do函数中, 我们要显示的是异常信息, 如果发生异常时的error_code(只有内部中断才会有错误码, 所以int指令和外部中断是没有的), rip, rsp, 以及通过分析error_code的32位得出的详细错误信息
IA-32e模式下的异常处理的更多相关文章
- ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务
★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...
- 软件调试——IA-32 保护模式下寄存器一览
最近在看张银奎先生的<调试软件>一书,想将关键的技术记录下来,以便日后查阅,也分享给想看之人吧. 1 通用寄存器 EAX,EBX,ECX,EDX:用于运算的通用寄存器,可以使用AX,BX等 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- (转)Unity3D在WebPlayer模式下的异常上报探索
我们知道,Unity3D在WebPlayer的发布模式下是沙箱环境中运行的.根据Unity3D的官方文档所述,WebPlayer模式下不能使用非托管的DLL,也就是说,传统C++游戏客户端的生成Min ...
- Unity3D在WebPlayer模式下的异常上报探索
原地址:http://www.cnblogs.com/hisiqi/archive/2013/07/21/3203527.html 我们知道,Unity3D在WebPlayer的发布模式下是沙箱环境中 ...
- x86架构:保护模式下利用中断实现抢占式多任务运行
站在用户角度考虑,一个合格的操作系统即使在单核下也能 "同时" 执行多个任务,这就要求CPU以非常快的频率在不同任务之间切换,让普通人根本感觉不到任务的切换.windwo ...
- DexHunter在ART虚拟机模式下的脱壳原理分析
本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...
- 微软Azure 经典模式下创建内部负载均衡(ILB)
微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...
- 苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转
昨天下午,测试提了一个bug,问题是:在苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转. 思前想后找了半天没思路,后来经过同事的点拨,说可能是禁用了cookie之类的,反正我也没思路就顺 ...
随机推荐
- Java编程思想读书笔记之一切皆对象
一切皆对象 Java程序运行时,数据保存到哪里 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配.我们对此没 ...
- Copy拷贝
前言 copy:需要先实现 NSCopying 协议,创建的是不可变副本. mutableCopy:需要实现 NSMutableCopying 协议,创建的是可变副本. 浅拷贝:指针拷贝,源对象和副本 ...
- E - 稳定排序(结构体)
大家都知道,快速排序是不稳定的排序方法. 如果对于数组中出现的任意a[i],a[j](i<j),其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排序是稳定的. 某 ...
- 【转】PHP微信上传永久图片素材
$TOKEN="XXXX"; $file = "D:\www\weixin\game.jpg"; $data = array( 'media'=> new ...
- [SinGuLaRiTy] 二分图&匈牙利算法
[SinGuLaRiTY-1019] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 二分图 二分图是图论中一种特殊的图形.顾名思义,二分图G ...
- ubuntu不能自windows拖拽文件解决办法
由虚拟机的安装更新所致,及时安装更新vmware tools 命令:tar -xzvf VMwareTools-10.0.6-3595377.tar.gz进入解压后的目录,执行:sudo ./wmw ...
- getsockname()和getpeername()
对于server端: 以端口为通配符方式bind:对于服务器,bind(0,ip),则调用bind函数之后,就可以调用getsockname获取服务器得到的本地端口号 以ip地址为通配地址bind,只 ...
- PAT天梯赛L1-054 福到了
题目链接:点击打开链接 "福"字倒着贴,寓意"福到".不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出.这里要处理的每个汉字是由一个 N x N 的 ...
- (16)break和continue
#(1)这里顺带说下pass # pass 过 的意思,防止代码报错,就是个占位的, if True: # 不允许代码块里面的内容为空,用pass占位 pass #(2)break (只能用在循环当中 ...
- maven 过滤webapp下的文件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-p ...