操作系统如何建立异常处理?
异常的分类
- 错误(fault) 错误是一种能被修复的异常。只要错误被修正,处理器可将程序或任务的运行环境还原至异常发生前,并重新执行产生异常的指令,也就是说异常的返回地址指向产生错误的指令,而不是其后的位置。
- 陷阱(trap) 陷阱异常同样运行处理器集训执行程序或任务,只不过处理器会跳过产生异常的指令,即陷阱异常的返回地址指向诱发陷阱指令之后的地址。
- 终止(abort) 终止异常用于报告非常严重的错误,它往往无法准确提供产生遗产的位置,同时也不允许程序或任务继续执行,典型的终止异常有硬件错误或系统表存在不合逻辑、非法值。
综上,当终止异常产生或,程序现场不可恢复,也无法继续执行。当错误异常和陷阱异常产生后,程序线程可以恢复并继续执行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tefvcZpE-1634731765191)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20211015105849254.png)]
处理器采用类似汇编指令CALL的调用方法来执行异常/中断处理程序。当处理器捕获到异常/中断时,便会根据异常/中断向量号(Interrupt Vector)从中断描述符表IDT索引出对应的门描述符,再由门描述符定位到处理程序的位置。如果向量号索引到一个中断门或者陷阱门,处理器将会像执行CALL指令访问调用门一般,去执行异常/中断处理程序。如果向量号索引到一个任务门。处理器将会发生切换,转而执行异常任务或中断任务,这个过程就像执行CALL指令访问 调用任务门一样。
异常/中断的处理步骤。
- 处理器会根据中断/异常向量号从中断描述符表IDT检索出对应的门描述符(中断门或陷阱门,Interrupt or Gate),并读取门描述符保存的段选择子。
- 从GDT或者LDT描述符表中检索出处理程序所在的代码段,再根据门描述符记录的段内偏移量,来确定中断/异常处理程序的入口地址。
处理器在执行中断/异常处理程序时,会检测中断/异常处理程序所在的代码段的特权级,并与代码段寄存器的特权级进行比较。
- 如果中断/异常处理程序的特权等级更高,则会在中断/异常处理程序执行前切换栈空间,以下是栈空间的切换过程。
- 处理器会从任务段TSS中取出对应的特权级的栈段选择子和栈指针,并将他们作为中断/异常处理程序的栈空间进行切换。在栈空间切换的过程中,处理器将自动把切换前的SS和ESP值压入到中断/异常处理程序栈。
- 在栈空间切换的过程中,处理器还会保存呗中断程序的EFLAGS、CS和EIP寄存器值到中断/异常处理程序栈。
- 如果异常会产生错误码,则将其保存在异常栈内,位于EIP寄存器之后。
- 如果特权等级相等
- 处理器将会保存中断程序的EFLAGS、CS和EIP寄存器值到栈中
- 如果异常会产生错误码,则将其保存在异常栈内,位于EIP寄存器之后。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fi6anYL5-1634731765193)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20211015112636415.png)]
关于Start_Kernel如何调用到color_printk
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wvz9ZIFC-1634731765194)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20211017214358548.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7P0LVUXu-1634731765195)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20211017214411388.png)]
将函数的地址保存到rcx寄存器中,使用call调用远程函数。其中esi,edi,eax是函数调用是传递的参数。其中EDI中的0xffff00是黄色,ESI寄存器中的0x00000000是黑色。Hello word保存在0xffff800000106108地址起始处。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7JJFkDzH-1634731765197)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20211017214801844.png)]
由于.rodata是数据段,所以反汇编的语法是错误的,只用观察16进制即可。
#TS异常和#PF异常的错误码位图
如果异常产生的原因(外部中断或int n指令均不会产生错误码)关系到一个特殊的段选择子或者IDT向量,那么处理器会在异常处理程序栈中存入错误码。值得注意的是,执行IRET指令并不会在异常返回过程中弹出错误码,因此在异常返回前必须手动将错误码从栈中弹出。
根据中断门、陷阱门或任务门的操作数位宽,错误码可以是一个字或双字,为了保证双字错误码入栈时的对齐 ,错误码的高半部分被保留。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H9P0kSHE-1634731765198)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20211018172914040.png)]
- EXT 如果该位置被置位,说明异常实在 向程序投递外部事件的过程中触发,例如一个中断或一个更早期的异常。
- IDT 如果该位被置位,说明错误码的段选择子部分记录的是中断描述符 表IDT内的门描述符,而复位则说明其记录的是描述符表GDT/LDT内的描述符。
- TI 只有当IDT 标志位复位时此位才有效。如果该位被置位,说明错误码的段选择子部分记录的是局部描述符表LDT内的段描述符或门描述符,而复位则说明它记录的是全局描述符表GDT的描述符
错误码的段选择子部分可以索引IDT、GDT、或LDT等描述符表内的段描述符或门描述符。在某些条件下,错误码是NULL(除EXT位外所有位均被清0),这表明错误并非由引用 特殊段或访问NULL段描述符而产生的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwNzz6Rz-1634731765199)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20211019124614856.png)]
可变参数函数
https://blog.csdn.net/weixin_44692935/article/details/103001787
操作系统如何建立异常处理?相关推荐
- linux操作系统下建用户,如何用Linux操作系统批量建立用户的shell
如何用Linux操作系统批量建立用户的shell 最近,笔者在校园网应用平台建设中采用了Linux操作系统,为校园网用户提供DNS.Apache.POP3.SMTP.FTP等服务.由于我校学生用户数在 ...
- 操作系统原理:中断,异常,系统调用
系统调用(system call):为应用程序请求操作提供服务.可异步和同步,对于返回值,同步会等待值返回再执行下一步,异步发出系统调用请求后,紧接着就会执行下一步操作. 异常 (Exception) ...
- 清华大学操作系统公开课笔记(向勇、陈渝)
转载:https://zhuanlan.zhihu.com/p/150510828 第一章:概述 内核功能:物理内存管理 | 虚拟内存管理 | 文件系统管理 | 中断处理和IO设备驱动 (底层硬件) ...
- C++编译器如何实现异常处理
C++编译器如何实现异常处理 原著:Vishal Kochhar 翻译:局部变量 原文出处:How a C++ compiler implements exception handling 译者注:本 ...
- 操作系统知识点总结和题集大杂烩
第一轮:从当前位置开始扫描到第一个(A =0, M = 0)的帧用于替换.表示该页面最近既未被访问,又未被修改,是最佳淘汰页 第二轮:若第一轮扫描失败,则重新扫描,查找第一个(A =0, M = 1) ...
- 操作系统-AOSOA
一.个人感受 1.1 权衡 在我写这份报告的时候,已经是 6 月 30 号了,经历了一个学期的"折磨",我面对终点,已经没啥感觉了,就想着赶快呼噜完了就完事了.其实做这个项目最大的 ...
- 异常处理与MiniDump详解(3) SEH(Structured Exception Handling)
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一. 综述 SEH--Structured Exception Handlin ...
- 发布AI操作系统、应用市场,开源机器学习数据库和AI操作系统内核,第四范式这波操作有点秀!
"AI的发展经历了'高期望--能否落地--落地是否有用"等多次潮起潮落.今天,AI的价值再次引发一些讨论和怀疑." 第四范式创始人兼首席执行官戴文渊在近日举行的新品发布会 ...
- 临时内核页表的建立过程
Motivation:当内核被解压到线性地址0x100000后,为了继续启动内核,即启动内核的第一个swapper进程,内核需要建立一张临时页表供其使用. 当内核从16位的实模式进入保护模式(通过在汇 ...
最新文章
- 扒皮下京东首页楼层图标的动画效果实现方式
- 如何解压tar.xz文件
- 携程试点每周两天居家办公反响热烈,76%的员工主动报名
- eclipse中导入SVN项目步骤
- 分布式系统架构的基本原则和实践
- Kafka系列之-Kafka监控工具KafkaOffsetMonitor配置及使用
- 如何抓取Camera systrace
- 【clickhouse】clickhouse NO DELAY, INTO OUTFILE, SETTINGS, ON, FORMAT, Dot, SYNC, token
- zabbix内网安装部署_搭建环境tomcat+nginx+keepalived+zabbix
- java统计汉字个数_java统计汉字字数的方法示例
- 车道线定位及拟合:直方图确定车道线位置
- Win10自动更新永久关闭Windows update medic service拒绝访问
- 从IP138上获取数据,查询多个IP的归宿地
- (20201209已解决)从window访问wsl地址
- 转行数据分析师后悔了?转行需要做哪些准备?
- 这样写的邮件,客户回复率几乎高达100%
- 华科大计算机系李瑞轩.,李瑞轩-智能与分布计算实验室
- 【购房必备知识】成都公积金贷款/商业贷款的一些知识记录
- 智能ABC输入法超酷技巧
- Spring Cloud Nacos整合 Seata 实现分布式事务
热门文章
- 单片机串口通讯RXD与TXD如何对接详解(独家!)
- TypeScript报错Object is possibly ‘undefined‘
- [脑科学]-这才是心理学
- OLED_I2C_3D_Cube
- python中的subprocess.Popen()使用详解---以及注意的问题(死锁)
- 【第 13 章 基于霍夫曼图像压缩重建--Matlab深度学习实战图像处理应用】
- 用3句话像老太太讲清楚什么是数据库
- eMMC格式化及烧录
- 微信打通腾讯地图 提供地图API接口
- Linux网络虚拟化基石 network namespace