异常控制流

来源:互联网 发布:淘宝店铺二级域名收费 编辑:程序博客网 时间:2024/05/18 03:46

概述

这是读《深入理解计算机系统》中异常控制流的读书笔记.

控制流

当创建一个进程时,程序计数器假设是一个值序列,a0…an-1, 其中ak是相应指令Ik的地址,每次从ak到ak+1的过渡称为控制转移。
这样的控制转移序列叫做控制流。

异常控制流(Exception Control Flow, ECF)

现代操作系统通过使控制流发生突变来对系统状态变化做出反应,这些突变称为异常控制流。

异常控制流的表现形式

异常控制流表现在系统的各个层次。

  1. 硬件层

    硬件检测到事件会触发控制转移到异常处理程序

  2. 操作系统层

    操作系统通过上下文转换将控制从一个用户进程转移到另一个用户进程; 内存缺页中断;

  3. 应用软件层
    软件异常允许程序非本地跳转(违反通常的调用/返回栈规则)。进程发送信号给另一个程序,控制流会转到信号处理程序; C语言的setjmp, longjmp;Java,C++的try catch;

异常及异常处理

异常是指控制流的突变。

异常的分类
  • 中断

    中断是异步(唯一的异步异常,其他的都是同步异常)发生的,是来自I/O设备信号的结果。

  • 陷阱

    陷阱是有意的异常,是执行指令的结果。陷阱最重要的用途是系统调用。

  • 故障

    故障是由错误引起的, 它可能被故障处理程序修复。典型的如内存缺页异常。

  • 终止

    终止通常是硬件故障,是不可恢复的错误,不会返回到用户指令。

异常处理
  • 当异常发生时,处理器会通过查找异常表,跳转到专门用来处理这类异常的异常处理程序。
  • 异常表的起始地址存储在异常表基址寄存器中。
  • 异常处理程序运行在内核模式下。
  • 在异常发生后,跳转到异常处理程序前,处理器需要将返回地址,以及其他额外的状态信息放入内核栈(不是用户栈,异常处理在内核模式下运行)。

用户态和内核态

  • 处理器通过寄存器中的模式位来标识进程处于用户态还是内核态。
  • 用户态进入内核态唯一的方式就是异常。
  • 用户态不允许执行特权指令,内核态可以执行任意指令。

unix信号

unix信号是一种软件异常。
- 发送信号

内核通过更新进程上下文中某个状态,发送一个信号给进程(信号存储在进程的PCB里)。发送信号有2种原因: 1. 操作系统检测到某个事件(比如除0) 2. 另一个进程调用kill函数

  • 待处理信号

    只发送没有被接收的信号称为待处理信号。

    1. 一种待处理信号至多只有一个待处理,后来的同类型信号会直接丢弃。
    2. 进程可以有选择的阻塞待处理信号,当信号被阻塞时,仍然可以被发送。但不会被接收,直到取消对这种信号的阻塞
  • 接收信号
    当目的进程被内核强迫对信号做出反应时,目的进程就接收了信号。

非本地跳转(nolocal jump)

非本地跳转是用户级异常控制流形式, 是在用户态中执行, 不会跳转的内核态。
C语言的setjmp,longjmp函数,C++,Java的try-catch.

Linux进程工具

  • strace
  • ps
  • top
  • pmap
  • /proc 是虚拟文件系统,以ascll形式输出内核数据结构的内容

参考资料

  • CSAPP异常控制流知识概要
0 0
原创粉丝点击