操作系统的框架:
应用程序
-----------------------虚拟机器界面 操作系统运行机制:系统调用
操作系统
----------------------物理机器界面 操作系统运行环境:CPU状态,中断和异常机制
硬件
处理器状态
一、处理器状态(模式)
1.中央处理器(CPU)处理器有运算器、控制器、一系列的寄存器以及高速缓存构成。
2.两类寄存器:
用户可见寄存器:高级语言编译器通过优化方法分配并使用之,以减少程序内存访问次数
控制和状态寄存器:用于控制处理器的操作,通常由操作系统代码使用。在某种级别下可以访问、修改
3.常见的控制和状态寄存器
程序计数器:
程序计数器(PC),记录将要取出的指令地址
指令寄存器(IR),记录最近取出的指令
程序状态字(PSW),记录处理器的运行状态,如条件码、模式、控制位等信息
4.操作系统的需求——保护
从操作系统的特征考虑
并发、共享
5.提出要求----->实现保护与控制
需要硬件提供基本运行机制:
处理器具有特权级别,能在不同的特权级运行的不同指令集合
硬件机制可以将OS和用户程序
隔离
6.处理器的状态(模式MODE)
现在处理器通常将CPU状态设计划分为
两种、
三种、或者
四种
在程序状态字寄存器PSW中专门设置一位,根据运行程序对资源和指令的使用权限而设置不同的CPU状态
例:X86架构中的EFLAGS寄存器
IOPL表示IO权限寄存器,两位,表示四个状态
二、特权指令和非特权指令
1.操作系统需要两种CPU状态
内核态:运行操作系统程序
用户态:运行用户程序
2.特权指令:只能由操作系统使用、用户程序不能使用的指令
非特权指令:用户程序可以使用的指令
特权指令:启动IO、内存清零、修改程序状态字、设置时钟、允许/禁止终端、停机
非特权指令:控制转移、算术运算、访管指令、取数指令
R0>R1>R2>R3
包含关系
3.例子:
X86系列处理器
支持4个处理器特权级别
特权环:R0、R1、R2、R3
从R0~R3 能力由高到低
R0相当于内核态,R3相当于用户态,R1和R2介于两者之间。现在大多数基于x86处理器操作系统只有R0和R3
不同级别能够运行的指令集合不同
4.CPU之间的转换
用户态->内核态
唯一途径->中断、异常、陷入机制
内核态->用户态
设置程序状态字PSW
5.一条特殊的指令:陷入指令
提供给用户程序的接口,用于调用操作系统的功能(服务)
比如:int,trap,syscall,sysenter.sysexit
三、操作系统的驱动力:中断与异常机制
中断/异常,对于操作系统的重要性就和飞机的发动机一样
可以说操作系统是由
中断驱动或者事
件驱动的
1.主要作用:
及时处理设备发来的中断请求
可以使OS捕获用户程序提出的服务请求
防止用户程序执行过程中的破坏行动
2.中断/异常的概念
CPU对系统发生的某个事件作出的一种反应
CPU暂停正在执行的程序,
保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序
3.事件的发生改变了处理器的控制流
特点:
随机发生,自动处理,可恢复
4.为什么引入中断和异常
中断的引入:
为了支持CPU和设备之间的并行操作
当CPU启动设备进行输入/输出后,设备便可以独立工作,CPU转去处理与此次输入/输出不相关的事情;当设备完成输入/输出后,通过向CPU发出中断报告此次输入/输出的结果,让CPU决定如何处理以后的事情。
异常的引入:
表示CPU执行指令时本身出现的问题
如算术溢出、除零、取数时奇偶错,访问地址时越界或执行了"陷入指令"等,这时
硬件改变了CPU执行流程,转到相应的错误处理程序或异常处理程序或执行系统调用
中断:外部事件,正在运行的,程序不期望的
异常:由正在执行的指令引发
5.中断和异常的总结
6.中断/异常机制工作原理
中断/异常机制是现代计算机系统的核心机制之一
硬件和软件相互配合而使计算机系统得以充分发挥能力
硬件该做什么事?——
中断/异常响应
捕获中断源发出的中断/异常请求,以一种一定方式响应,将处理器控制权交给特定的处理程序
软件要做什么事?——
中断/异常处理程序
识别中断/异常类型并完成相应的处理
6.中断相应过程示意
允许中断
|
开始————取下一条指令————执行指令————检查指令处理中断
|
在每条指令执行周期的最后时刻扫描中断寄存器,查看是否有中断信号?若有中断,
中断硬件将该中断触发器内容按规定编码送入PSW的相应位,称为中断码,通过查中断向量表引出中断处理程序
7.中断向量表:
一个内存单元,存放中断处理程序入口地址和程序运行时所需要的处理状态字。
执行流程按中断号/异常类型的不同,通过中断向量表转移控制权给中断处理程序
中断向量表:
中断响应示意图
8.中断处理程序
- 设计操作系统时,为每一类中断/异常事件编号响应处理程序,并设置好中断向量表
- 系统运行时若响应中断,中断硬件部件将CPU控制权转给中断处理程序
- 保存相关寄存器信息
- 分析中断/异常的具体原因
- 执行对应的处理功能
- 恢复现场,返回被事件打断的程序
- 软件提前设置好,硬件来执行
9.中断/异常机制小结
以设备输入输出中断为例:
CPU处理完当前指令后检测到中断,判断出中断来源并向相关设备发确认信号
CPU开始为软件处理中断做准备:
处理器状态被切换到内核态
在系统栈中保存被中断程序的重要上下文环境,主要是程序计数器PC、程序状态字PSW
CPU根据中断码查中断向量表,获得与该终端相关处理程序的入口地址,并将 PC设置成该地址,新的指令周期开始时,CPU控制转移到中断处理程序。----硬件
中断处理程序开始工作:----软件
在系统栈中保存现场信息
检查I/O设备的状态信息,操作I/O设备或者在设备和内存之间传送的数据等等
中断处理结束时,CPU检测到中断返回指令,从系统栈中恢复被中断程序的上下文环境,CPU状态恢复成原来新的状态,PSW和PC恢复成中断前的值,CPU开始一个新的指令周期
举例:I/O中断处理程序
通常分为两类处理:
I/O操作正常结束
若有程序正在等待此次I/O的结果,则应将其唤醒
若要继续I/O操作,需要准备好数据重新启动IO
I/O操作出现错误
需要重新执行失败的I/O操作
重试次数有上限,达到时,系统将判定为硬件故障
10.中断/异常机制实例---X86处理器为例
中断 是由硬件信号引发的,分为可屏蔽和不可屏蔽中断
异常
由指令执行引发,对于某些异常,CPU会在执行异常处理程序之前产生硬件错误码,并压入内核堆栈
系统调用
异常的一种,用户态到内核态的唯一入口
11.中断控制器
负责将硬件的中断信号转换为中断向量,并引发CPU中断
实模式:中断向量表
存放中断服务程序的入口地址
入口地址=段地址左偏移4位 + 偏移地址
不支持CPU运行状态切换
中断处理与一般的过程调用相似
保护模式:
中断描述符采用门描述数据结构表示中断向量
中断向量表/中断描述表
四种类型门描述符
- 任务门
- 中断门:给出段选择符,中断异常程序的段内偏移量
- 陷阱门:与中断门后系统会自动禁止中断
- 调用门
中断/异常的硬件处理过程:
- 确定与中断或异常关联的向量i
- 通过IDTR寄存器找到IDT表,获得中断描述符(表中的第i项)
- 从GDTR寄存器获得GDT的地址;结合中断描述符中的段选择描述符;从该段描述符中得到中断或异常处理程序所在的段基址
- 特权级检查
检查是否发生了特权级的变化,如果是,则进行堆栈切换(必须使用与新的特权级相关的栈)
硬件压栈,保存上下文环境;如果异常产生了硬件出错码,也将它保存在栈中
如果是中断,清楚IF位
通过中断描述符中的段内偏移量和段描述符中的基地址,找到中断/异常处理程序的入口地址,执行其第一条指令
操作系统向用户程序提供的接口
四、系统调用机制
1.系统调用:用户在编程时可以调用的操作系统功能
系统调用是操作系统提供给编程人员的唯一接口
使CPU状态从用户态陷入内核态
2.系统调用机制设计与执行过程
中断/异常机制
支持系统调用服务的实现
选择一条特殊指令:陷入指令
引发异常,完成用户态到内核态的切换
系统调用号和参数
每个系统调用都事先给定一个编号
系统调用表
存放系统调用服务例程的入口地址
3.参数传递过程问题
怎样实现用户程序的参数传递给内核
常见的三种方法
由陷入指令自带参数:陷入指令的长度有限,且还要携带系统调用功能号,只能自带有限参数
通过通用寄存器传递参数:这些寄存器是操作系统和用户程序都能访问的,但寄存器的个数会限制传递参数的数量
在内存中开辟专用堆栈来传递参数
系统调用执行过程:
- 当CPU执行到特殊的陷入指令时:
- 中断/异常机制:硬件保护现场了通过查中断向量表将控制权转给系统调用总入口程序。
- 系统调用总入口程序:保存现场;将参数保存在内核堆栈里;通过查系统调用表把控制权交给相应的系统调用处理例程或者内核函数
- 执行系统调用例程
- 恢复现场,返回用户程序
为了让其他中断进来,保证可重入