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之类的,反正我也没思路就顺 ...
随机推荐
- Http工作原理(转)
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少.它不仅保证计算机正确 ...
- 大白话解说TCP/IP协议三次握手和四次挥手
背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,听不到对方的声 ...
- [51nod1190]最小公倍数之和V2(莫比乌斯反演)
题解 传送门 题解 我是真的不明白这玩意儿是怎么跟反演扯上关系的-- 首先 \[ \begin{align} ans &=b\sum_{d|b}{1\over d}\sum_{i=a}^{b} ...
- bzoj1560:[JSOI2009]火星藏宝图(斜率优化)
题目描述 在火星游玩多日,jyy偶然地发现了一张藏宝图.根据藏宝图上说法,宝藏被埋藏在一个巨大的湖里的N个岛上(2<=N<=200,000).为了方便描述,地图把整个湖划分成M行M列(1& ...
- ios swift 实现简单MVP模式
在移动开发中,会用到各种架构,比如mvp,mvvm等,其目的就是为了让项目代码的可读性更好,减轻在android(activity) ios(controller)中的大量代码问题.接下来就开始我们的 ...
- 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息
第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...
- 过河卒 NOIp 2002 dp
题目描述 棋盘上AAA点有一个过河卒,需要走到目标BBB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦 ...
- vue项目中禁止移动端双击放大,双手拉大放大的方法
在vue打包后生成的dist目录文件下下面有index.html 打开里面 把原来的这个 <meta name=viewport content="width=device-width ...
- apache 压缩 gzip
配置 编辑httpd.conf文件 去掉 #LoadModule headers_module modules/mod_headers.so 前面的注释# 去掉 #LoadModule deflate ...
- maven 打包 包含xml
<build> <finalName>dc-exam</finalName> <!-- 包含xml文件 --> <resources> &l ...