CSAPP第八章
CSAPP第八章
参考https://www.cnblogs.com/zy691357966/p/5480537.html
8.1异常
异常是异常控制流的一种形式,一部分由硬件实现,一部分由操作系统实现
a transfer of control to the OS kernel in response
to some event
异常(exception)控制流的突变,用来响应处理器状态的某些变化。
事件(event)状态变化
- 事件可能与当前执行指令有关
- 存储器缺页,算数溢出
- 除0
- 也可能与当前执行指令无关
- I/O请求
- 定时器产生信号
通过异常表(exception table)的跳转表,进行间接过程调用(异常),到专门设计处理这种事件的操作系统子程序(异常处理程序(exception handler)
异常处理程序在执行结束后,会发生以下三种情况之一:
1. 返回应用程序当前指令Icurr
2. 返回应用程序的下一条指令Inext
3. 异常处理程序终止被中断的应用程序
8.1.1 异常处理
系统启动时,操作系统分配和初始化一张称为异常表
的跳转表。
- 条目k包含异常k的处理程序的地址。
异常表
的起始地址放在叫异常表基址寄存器
的特殊CPU寄存器中。异常
类似过程调用
,不过有以下不同- 过程调用,跳转到处理程序前,处理器将返回地址压入栈中。对于异常,返回地址是当前,或下一跳指令。
- 处理器会把额外的处理器状态压入栈中。
- 如果控制一个用户程序到内核,那么所有这些项目会被压入内核栈中,而是用户栈。
- 异常处理程序运行在内核模式下,这意味他们对所有系统资源有完整访问权限。
8.1.2 异常的类别
同步 synchronous 当一个方法被调用时,调用者需等待该方法执行完毕返回才能继续执行
异步 asynchronous 当一个方法被调用时,立即返回,并获取一个线程执行该方法内部的业务,调用者不用等待该方法执行完毕
1.中断
中断异步发生,来自处理器外部的I/O设备的信号的结果
硬件中断不是由任何一条专门的指令造成,从一定意义上时异步的