美文网首页
异常控制流

异常控制流

作者: 菜根小友 | 来源:发表于2019-03-31 21:31 被阅读0次

异常控制流

7.1 进程与进程的上下文切换

  • 程序和进程的概念
  • 进程的逻辑控制流
  • 进程的上下文切换
  • 进程的私有地址空间
  • 程序的加载和运行

7.2 异常和中断

  • 基本概念
  • 异常的分类
  • 中断的分类
  • 异常和中断的响应过程

7.3 小结


一个程序的正常执行流程有两种顺序:

  • 按指令存放的顺序执行,即新的PC值为当前指令地址加当前指令长度
  • 跳转到由转移类指令指出的转移目标地址处执行,即新的PC值为转移目标地址

CPU所执行的指令的地址序列称为CPU的控制流,通过上述两种方式得到的控制流为正常控制流。

在程序正常执行的过程中,CPU会遇到内部异常事件或者外部中断事件而打断原来程序的执行,转去执行操作系统提供的针对这些特殊事件的处理程序。这种由于某些特殊情况引起用户程序的正常执行被打断所形成的意外控制流被称为异常控制流。显然,计算机系统必须提供一种机制,使其自身能够实现异常控制流。

在计算机系统的各个层面都有实现异常控制流的机制。例如,在底层的硬件层,CPU中有检测异常和中断事件并将控制转移到操作系统内核执行的机制;在中间的操作系统层,内核能通过进程的上下文切换将一个进程的执行转移到另一个进程执行。在上层的应用软件层,一个进程可以直接发送信号到另一个进程,使得接收到信号的进程将控制转移到它的一个信号处理程序执行。

本章主要介绍硬件层和操作系统层中涉及的对于内部异常和外部中断的异常控制流实现机制。主要内容包括:进程与进程上下文切换、异常的类型、异常的捕获和处理、中断的捕获和处理、系统调用的实现机制等。


7.1 进程与进程的上下文切换

7.1.1 程序和进程的概念

每个应用程序在系统运行时(用户进程)均有属于自己的存储空间,用来存储自己的程序代码和数据,包括只读区(代码和只读数据)、可读可写区(初始化数据和未初始化数据)、动态的堆区和栈区等。

"进程"的引入为应用程序提供了以下两方面的抽象:

  • 一个独立的逻辑控制流
  • 一个私有的虚拟地址空间

每个进程拥有一个独立的逻辑控制流,使得程序员以为自己的程序在执行过程中独占处理器;拥有一个私有的虚拟地址空间,使得程序员以为自己独占存储器

7.1.2 进程的逻辑控制流

一个可执行目标文件被加载并启动执行后,就成为一个进程。不管是静态链接生成的完全链接可执行文件,还是动态链接后在存储器中形成的完全链接可执行目标,它们的代码段中的每条指令都有一个确定的地址,在这些指令执行的过程中,会形成一个指令执行的地址序列,对于确定的输入数据,其指令执行的地址序列也是确定的。这个确定的指令执行地址序列称为进程的逻辑控制流

对于一个具有单处理器核的系统,如果在一段时间内有多个进程在其上运行,那么,这些进程会轮流使用处理器,也即处理器的物理控制流由多个逻辑控制流组成。例如,假定在某段时间内,单处理器系统中有三个进程p1、p2和p3在运行,其运行轨迹如图所示,图中水平方向为时间,垂直方向为执行指令的地址。

image.png

连续执行同一个进程的时间段称为时间片。例如,图中t0到t2为一个时间片,t2到t4为一个时间片。对于某一个进程来说,其逻辑控制流并不会因为中间被其他进程打断而改变,因为被打断后还能回到原被打断的“断点”处继续执行。每个时间片结束时,通过进程的上下文切换,换一个新的进程到处理器上执行,从而开始一个新的时间片,这个过程称为时间片轮转处理器调度

7.1.3 进程的上下文切换

操作系统通过处理器调度让处理器轮流执行多个进程。实现不同进程中指令交替执行的机制称为进程的上下文切换

进程的物理实体(代码和数据等)和支持进程运行的环境合称为进程的上下文

  • 由用户进程的程序块、数据块、运行时的堆和用户栈(统称为用户堆栈)等组成的用户空间信息被称为用户级上下文
  • 由进程标识信息,进程现场信息、进程控制信息和系统内核栈等组成的内核空间信息被称为系统级上下文
  • 处理器中各个寄存器的内容被称为寄存器上下文(也称硬件上下文)。

其中,用户级上下文地址空间和系统级上下文地址空间一起构成了一个进程的整个存储器映像,如图,实际上它就是进程的虚拟地址空间。进程控制信息包含各种内核数据结构,例如,记录有关进程信息的进程表、页表、文件表等。

上下文切换发生在操作系统调度一个新进程到处理器上运行时,它需要完成以下三件事:

  • 将当前进程的寄存器上下文保存到当前进程的系统级上下文的现场信息中
  • 将新进程系统级上下文中的现场信息作为新的寄存器上下文恢复到处理器的各个寄存器中
  • 将控制转移到新进程执行。这里。
    一个重要的上下文信息就是PC值,当前进程被打断的断点处的PC作为寄存器上下文的一部分被保存在进程现场信息中,这样,下次该进程再被调度到处理器上执行时,就可以从其现场信息中获得断点处的PC,从而能从断点处开始执行。


    image.png

7.1.4 进程的私有地址空间

如图所示,Inter架构下Linux操作系统中的一个进程对应的虚拟地址空间存储映像。


image.png

整个虚拟地址空间分为两大部分:

  • 内核虚拟存储空间(简称内核空间)
  • 进程虚拟存储空间(简称用户空间)
    在采用虚拟存储机制的系统中,每个程序的可执行目标文本在装入时都被映射到同样的虚拟地址空间上,也即,所有的用户进程的虚拟地址空间是一致的,只是在相应的只读区域和可读写数据区域中映射的信息不同而已,它们分别映射到对应可执行目标文件中的只读段(节.init、.text和.rodata组成的段)可读写数据段(节.data和.bss组成的段)。其中,只有.bss节在可执行目标文件中没有具体内容,因此,在运行时由操作系统将该节对应的存储区初始化为0。
    7.1.5 程序的加载和运行

当启动一个可执行目标文件执行时,首先会通过某种方式调出常驻内存的一个称为加载器的操作系统程序来进行处理。

一个hello程序的加载执行,大致过程如下:

  • shell命令解释器输出一个命令行提示符(如:unix >),并开始对命令行进行解析,获得各个命令行参数并构造传递给函数execve()的参数列表argv,将参数个数送给argc。
  • 调用函数fork(),创建一个子进程,新创建的子进程获得与父进程完全相同的虚拟存储空间中的一个备份,包括只读端、可读写数据段、堆以及用户栈等。

7.2 异常和中断
一个进程在正常执行过程中,其逻辑控制流会因为各种特殊事件被打断。这些特殊事件统称为异常或者中断

当发送异常或者中断时,正在执行进程的逻辑控制流被打断,CPU转到具体的处理特殊事件的内核程序去执行。显然,这也会引起一个异常控制流。但是,它与上下文切换有一个明显的不同:上下文切换后CPU执行另一个用户进程,但是,中断或异常处理程序执行的代码不是一个进程,而是一个内核控制路径,它代表异常或中断发生时正在运行的当前进程在内核态执行的一个独立的指令序列。作为一个内核控制路径,它比进程更“轻”,其上下文信息比一个进程的上下文信息少得多。

7.2.1 基本概念

  • 内中断(异常):由CPU内部产生的意外
    +外中断(中断):通过CPU的中断请求引脚从CPU外部发出的中断请求

中断是一种典型地由I/O设备触发的,与当前正在执行的指令无关的异步事件;而异常是处理器执行一条指令时,由处理器在其内部检测到的,与正在执行的指令相关的同步事件。

异常和中断引起的异常控制流如图所示,反映了从CPU检测到用户进程发生异常或中断事件,到CPU改变指令执行控制流而转到操作系统中的异常或中断处理程序执行,再到从异常或中断处理程序返回用户进程执行的过程。


异常和中断处理的大致过程如下:
当CPU在执行当前程序或任务(即用户进程)的第i条指令时检测到一个异常事件,或在执行第i条指令后发现有一个中断请求信号,则CPU会打断当前用户进程,然后转到相应的异常或中断处理程序去执行。若异常或中断处理程序能够解决相应问题,则在异常或中断处理程序的最后,CPU通过执行“异常/中断返回指令”回到被打断的用户进程的的第i条指令或者第i+1条指令继续执行;若异常或中断处理程序发现是不可恢复的致命错误,则终止用户进程。通常情况下,对于异常和中断事件的具体处理过程全部由操作系统(可能包括驱动程序)软件来完成。

通常,把处理异常事件的程序称为异常处理程序,把处理中断事件的程序称为中断服务程序,合在一起时,本教材称其为异常或中断处理程序。

7.2.2 异常的分类
Intel将内部异常分为三类:

  • 故障
  • 陷阱
  • 终止

7.2.3 中断的分类
中断是由外部I/O设备请求处理器进行处理的一种信号,它不是由当前执行的指令引起的。外部I/O设备通过特定的中断请求信号线向CPU提出中断申请。CPU在执行指令的过程中,每执行完一条指令就查看中断请求引脚,如果中断请求引脚的信号有效,则进入中断响应周期。在中断响应周期中,CPU先将当前PC值(称为断电)和当前机器状态保存到栈中,并设置成关中断状态,然后,从数据总线读取中断类型号,根据中断类型信号跳转到对应的中断服务程序执行。中断响应过程由硬件完成,而中断服务程序执行具体的中断处理工作,中断处理完成后,再回到被打断程序的“断电”处继续执行。整个过程如图所示:


Intel将外部中断分为可屏蔽中断不可屏蔽中断
  • 可屏蔽中断

是指通过可屏蔽中断请求线INTR向CPU进行请求的中断,主要来自I/O设备的中断请求。CPU可以通过在中断控制器中设置相应的屏蔽字来屏蔽它或不屏蔽它,若一个I/O设备的中断请求被屏蔽,则它的中断请求信号将不会被送到CPU。

  • 不可屏蔽中断

可屏蔽中断通常是非常紧急的硬件故障,通过专门的不可屏蔽中断请求线NMI向CPU发出中断请求。如:电源掉电、硬件线路故障等。这类

7.2.4 异常和中断的响应过程

在CPU执行指令过程中,如果发生了异常事件或中断请求,则CPU必须进行相应的处理。CPU从检测到异常或中断事件,到调出相应的异常或中断处理程序开始执行,整个过程称为“异常和中断的响应”。CPU对异常和中断的响应过程可分为以下三个步骤:

  • 保护断点和程序状态

断点与异常类型有关。为了能在异常处理后正确返回到原被中断的程序继续执行,数据通路必须能正确计算断点处地址。显然,断点与异常类型有关。为了能在异常处理后正确地返回到原被中断的程序继续执行,数据通路必须能够正确地计算断点处的地址。假定计算出的断点地址存放在PC中,则保护断点时,只要将PC送到堆栈或特定的寄存器中即可。

因为异常处理后可能还要回到原被中断的程序继续执行,所以,被中断时原程序的状态(如产生的各种标志信息,允许自陷标志等)都必须保存起来。通常每个正在运行程序的状态信息存放在一个专门的寄存器中,这些寄存器统称为程序状态字寄存器(PSWR),存放在PSWR中的信息称为程序状态字(PSW)

  • 关中断

应该有一种机制来禁止在处理异常或中断时再响应新的异常或中断。通常通过设置“中断允许位”(“中断允许”触发器)来实现。当中断允许位被置1,则为开中断,表示允许响应中断或异常;若中断允许位被清0,则为关中断,表示不允许响应中断或异常。

在异常或中断响应过程中,通常由CPU将中断允许位清0,以进行关中断操作。

  • 识别异常和中断事件并转相应的处理程序执行

在调出异常和中断处理程序之前,必须知道发生了什么异常或哪个I/O设备发出了中断请求。一般来说,内部异常事件和外部中断源的识别

相关文章

  • 2018-11-29

    ## 异常控制流 异常控制流存在于系统的每个层级,最底层的机制称为**异常(Exception)**,用以改变控制...

  • 异常控制流

    学习目标 1.了解异步异常与同步异常,以及异常控制流与平时的逻辑控制流的差异2.理解进程的工作机制,如何通过异常来...

  • 异常控制流

    cpu会因为遇到内部异常或外部中断等原因而打断程序的正常控制流,转去执行操作系统提供的针对这些特殊事件的处理程序,...

  • 异常控制流

    异常控制流 7.1 进程与进程的上下文切换 程序和进程的概念 进程的逻辑控制流 进程的上下文切换 进程的私有地址空...

  • 异常控制流

    现代系统必须能够对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获的,而且也不一定要和程序的执行相关。比...

  • 异常控制流

    异常控制流 系统需要能够对系统状态的改变做出反应,这些系统状态不是被内部程序变量捕获的,而且也不一定和程序的执行相...

  • 异常控制流

    系统通过使处理器控制流发生突变来对系统状态的变化作出反应,我们把这种突变称为异常控制流(Exceptional C...

  • 异常控制流2

    中断和异常的处理: 发生异常和中断事件后,系统将进入os内核对响应的事件进行处理,即改变处理器状态(用户态->内核...

  • 深入理解计算机之异常

    异常 异常是异常控制流的一种形式,部分有硬件实现,部分由操作系统实现,是控制流的一种突变,用以响应处理器某些状态变...

  • 操作系统对异常的处理

    文章结构为 1:什么是异常 2:怎么处理异常 什么是异常: 先说下什么是异常控制流,htt...

网友评论

      本文标题:异常控制流

      本文链接:https://www.haomeiwen.com/subject/vimxvqtx.html