操作系统如何建立异常处理?

异常的分类
  • 错误(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值