介绍
-
从给处理器加电开始,直到断点为止,程序计数器假设一个值的序列
a0,a1,……,an-1 (控制流) -
异常控制流:现代系统通过使控制流发生突变来对这些情况作出反应。
8.1异常
-
异常是异常控制流的一种形式,它一部分是由硬件实现的,一部分是有操作系统实现的。
-
异常的概念、状态变化、异常表的作用;
-
异常处理程序完成处理后,会发生三种情况。
8.1.1 异常处理
-
系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号。
-
异常号:到异常表中的索引,异常号的分配。
-
异常与过程调用的不同之处:
(1)过程调用时,在跳转到处理器之前,处理器将返回地址压入栈中。然而,根据异常的类型,返回地址要么是当前指令,要么是下一条指令。
(2)处理器把一些额外的处理器状态压入栈里,在处理程序返回时,重新开始被中断的程序会需要这些状态。
(3)如果控制从一个用户程序转移到内核,那么所有这些项目都被压到内核栈中,而不是压到用户栈中。
(4)异常处理程序运行在内核模式下,意味着它们对所有的系统资源都有完全的访问权限。
8.1.2 异常的类别
- 中断:
(1)异步发生,是来自处理器外部的I/O设备的信号的结果。 硬件异常中断处理程序通常称为中断处理程序。
(2)异步异常是有处理器外部的I/O设备中的时间产生的,同步异常是执行一条指令的直接产物。
(3)陷阱、故障、终止时同步发生的,是执行当前指令的结果,我们把这类指令叫做故障指令。 - 陷阱和系统调用
(1)陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
(2)普通的函数运行在用户模式中,用户模式限制了函数可以执行的指令的类型,而且它们只能访问与调用函数相同的栈。系统调用运行在内核模式中,内核模式允许系统调用执行指令,并访问定义在内核中的栈。 - 故障:是由错误情况引起的。
例如:abort例程会终止引起故障的应用程序。 根据故障是否能够被修复,故障处理程序要么重新执行引起故障的指令,要么终止。例如:缺页故障。 - 终止:是不可恢复的致命错误造成的结果,通常是一些硬件错误。终止处理程序从不将控制返回给应用程序。
8.1.3 linux/IA32系统中的异常
-
linux/IA32故障和终止:
(1)除法错误(linux中称为浮点异常)
(2)一般保护故障(linux中称为段故障)
(3)缺页
(4)机器检查 -
linux/IA32系统调用
每一个系统调用都有一个唯一的整数号,对应于一个到内核中跳转表的偏移量。 -
C程序用syscall函数可以直接调用任何系统调用。
linux系统调用的参数都是通过寄存器而不是栈传递的,寄存器%eax包含系统调用号,栈指针%esp不能使用,因为当进入内核调用时,内核会覆盖它。
8.2 进程
-
进程:一个执行中的程序的实例。
-
进程提供给应用程序的关键抽象:
一个独立的逻辑控制流,独占地使用处理器;
一个私有的地址空间,独占地使用存储器系统。
8.2.1 逻辑控制流
- 程序计数器:唯一的对应于包含在程序的可执行目标文件中的指令,或者是包含在运行时动态链接到程序的共享对象中的指令。这个PC值的序列叫做逻辑控制流,简称逻辑流。
8.2.2 并发流
-
并发流:一个逻辑流的执行在时间上与另一个流重叠。
并发:多个流并发地执行的一般现象。
特点:多任务、时间片 -
并行流:如果两个流并发的运行在不同的处理器核或者计算机上
8.2.3 私有地址空间
- 和这个空间中某个地址相关联的那个存储器字节是不能被其他进程读或者写的。所以这个空间地址是私有的。
8.2.4 用户模式和内核模式
-
模式位:用某个控制寄存器中的一个位模式,限制 一个应用可以执行的指令以及它可以访问的地址空间范围。
-
当设置了位模式,进程就运行在内核模式中,一个运行在内核模式中的进程可以中兴指令集中的任何指令,而且可以访问系统中任何存储器位置。
-
没有设置位模式时,进程就运行在用户模式中,不允许执行特权指令,例如停止处理器、改变位模式,或者发起一个I/O操作。
-
用户程序必须通过系统调用接口间接的当问内核代码和数据。
-
进程从用户模式变为内核模式的唯一方法是通过诸如:中断、故障、或者陷入系统调用这样的异常。
-
上下文切换
- 上下文:内核重新启动一个被抢占的进程所需的状态。
- 调度:内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程。有内核中称为调度器的代码处理的。
- 上下文切换机制:
(1)保存当前进程的上下文
(2)恢复某个先前被抢占的进程被保存的上下文
(3)将控制传递给这个新恢复的进程- 引起上下文切换的情况
(1)当内核代表用户执行系统调用时
(2)中断时
-