计算机中的异常(异常处理机制能解决程序中遇到的所有)

当计算机执行程序时,它按照逐段执行代码的流程运行。当流程切换到下一段代码时,我们把这个切换过程称为「控制转移流」。而在出现异常情况时,这个过程被称为「异常控制流」。
什么是异常?
「异常」其实是异常控制流的一种形式,由计算机的硬件和操作系统共同实现,虽然各个计算机的具体细节可能不同,但其基本概念都相同。

什么是异常表?
当系统启动时,操作系统会初始化一张「异常表」,异常表是一张跳转表,用于管理不同类型异常的处理程序地址。
每种异常都有一个唯一的「异常号」,当处理器检测到异常事件时,它会使用异常表来定位并执行相应的异常处理程序,这些异常处理程序可以是处理器设计者或操作系统内核设计者分配,用于处理各种异常情况,如除零错误、内存越界、算术溢出等。

计算机中的异常(异常处理机制能解决程序中遇到的所有)

当指令顺序为:指令1 → 指令2 → 指令3,当发生异常后,根据处理表中对应处理程序的执行结果,有三种可能情况:
  • 处理程序将控制返回给当前指令(指令1),就是异常发生时正在执行的指令(指令1)。
  • 处理程序将控制返回给下一条指令(指令2),即继续执行在异常触发前已经在栈中准备好的下一条指令(指令2)。
  • 处理程序终止被中断的程序,即停止执行原本的程序代码。
异常的类型
计算机中存在不同类型的异常,如中断、陷阱、故障和终止,我们来详细分析下。
  • 中断

异步事件,由处理器外部 I/O 设备触发。

计算机中的异常(异常处理机制能解决程序中遇到的所有)

处理器在当前指令完成后检测到中断引脚的电压变高了,从系统总线读取「异常号」,根据异常号查找并执行相应的中断处理程序。
处理程序执行完毕后,控制权返回给下一条指令,使程序继续执行,就好像没有中断发生一样。
  • 陷阱

有意引发的异常。
计算机中的异常(异常处理机制能解决程序中遇到的所有)
用于提供「用户模式」与「内核模式」之间的接口,称为系统调用。
用户程序通常需要请求内核提供服务,如读文件、创建进程、加载新程序、终止进程等等,这些操作需要在「内核模式」下执行。
用户程序运行在用户模式下,受到限制,无法直接访问内核栈。通过执行\\”syscall n\\”等指令,用户程序触发陷阱,调用相应的内核程序,解析参数并执行特权操作。
  • 故障

故障是由错误情况引起的,可能会被故障处理程序修复。当故障发生时,处理器将控制权转移给故障处理程序。
如果故障可处理,控制权返回给引发故障的程序,允许重新执行。如果无法处理,控制权返回给内核的 abort 例程,终止引发故障的应用程序。

当指令引用一个虚拟地址时,该地址与对应的页面不在内存中,必须从磁盘中取出,因此就会发生故障,处理程序从磁盘加载适当的页面,然后控制返回给引起故障的指令。
当指令再次执行时,相应的页面已经在内存中了,指令就可以没有故障的运行完成。
  • 终止

由不可恢复的致命错误引发,通常是硬件错误。终止程序不将控制权返回给应用程序,而是直接返回给一个 abort 例程,该例程终止应用程序的执行。

这些异常类别允许操作系统和硬件有效地处理各种事件和错误情况,以确保系统的稳定性和可靠性。
在x86-64系统中,有高达 256 种不同的异常类型。其中,0~31 异常类型是由 Intel 架构师定义的,包括除零、越界检测、无效操作码等。
而 32~255 异常类型是由操作系统定义的中断和陷阱,它们可以根据不同的操作系统和应用程序需求来定义和使用。
这种分隔使操作系统能够在32到255的范围内自由定义和管理中断和陷阱,以满足特定系统的要求,同时保持与硬件异常的分离,从而提高了系统的可扩展性和灵活性。

题图生成:Pixabay
内容优化:ChatGPT
内容来源:《深入理解计算机系统》

原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34588.html

(0)
小道研究's avatar小道研究
上一篇 2024年4月9日 下午10:10
下一篇 2024年4月9日 下午10:12

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注