现代操作系统-操作系统运行环境与运行机制
---恢复内容开始---
应用程序
------------------- 虚拟机器界面
操作系统
-----------------物理机器界面
硬件
操作系统的运行环境为 1.CPU状态2.中断/异常机制
操作系统运行机制: 系统调用
处理器状态与模式
CPU由运算器,控制器,寄存器,高速缓存构成
寄存器分为:
用户可见寄存器:用于优化算法分配使用的
控制和状态寄存器:用于控制处理器操作,由操作系统使用
一般的控制状态寄存器可以在某种特级权别控制处理器操作,常见的控制和状态寄存器 程序计数器,指令寄存器,程序状态字(PSW)
PSW:记录cpu的运行状态,比如条件码,模式,控制位
操作系统特征:并发,共享,因此,我们需要实现保护与控制
硬件提供的基本运行机制:
处理器有特权级别,不同的级别可以使用的指令集合是不同的
硬件机制可以将os跟用户程序隔离
现代操作系统通常把cpu的状态分为2-4种,PSW中有一位专门用来控制资源和指令的使用权限
linux操作系统一般的CPU状态分为2种,用户态跟内核态
用户态->内核态 中断/异常/陷入机制(一条特色指令,如trap,int,syscall)
内核态->用户态 设置PSW
中断:cpu对系统发出的某个事件作出的一种反应
cpu暂停正在执行的程序,保留现场,自动转去执行相应事件的处理程序,处理完成后返回断电,继续执行被打断的程序
特点:随机发生,自动处理,可恢复,
中断/异常机制工作原理
中断跟异常的不同点
中断:外部事件,正在运行的程序不期望
异常:由自己正在执行的指令所引发的
事件分为:中断跟异常
中断:I/O中断,时钟中断,硬件故障
异常:系统调用,页故障,保护性异常等
中断异常机制工作原理
硬件: 捕获中断源发出的中断/异常请求 ,以一定方式响应,将处理器控制权交给特定的处理程序
软件:中断/异常处理程序,识别中断,异常类型,并完成相应处理
中断响应:发现中断,接收中断的过程,由中断硬件部件完成,中断处理控制部件设有中断寄存器
cpu响应:在每条指令执行周期的最后时刻扫描中断寄存器,查看是否中断信号,如果有中断,中断硬件将该中断触发器内容按规定编码送入PSW的相应位,称为中断码,通过查中断向量表引出中断处理程序
中断向量:一个内存单元,存放中断处理程序入口地址跟程序运行时所需的cpu状态字
(执行流程按照中断号/异常类型的不同,通过中断向量表转移控制权给中断处理程序)
中断响应示意:
设备发出中断信号,硬件保护现场(PSW,PC保存在系统堆栈),根据中断码查表,把中断处理程序入口地址等推送到相应的寄存器,执行中断处理程序
在设计操作系统时,给每一类中断/异常事件编写好相应的处理程序,并设置好中断向量表
系统运行时,如果响应中断,中断硬件部件将cpu控制权转给中断处理程序:
保存相关寄存器信息,分析中断/异常的具体原因,执行对应的处理功能,恢复现场,返回被事件打断的程序
设备输入输出中断为例:
打印机给cpu发送中断信号,CPU处理当前指令后检测到中断,判断中断来源并且向相关设备发确认信号,,处理器状态切换为内核态
在系统栈保存:PC,PSW,cpu根据中断码查中断向量表,获得该相关中断的处理程序的入口地址,将PC设置为此地址,新的指令周期开始,CPU控制转移到中断处理程序,中断处理程序开始工作,在系统栈中保存现场信息,检查I/O设备信息,等等之类
中断处理结束,cpu检测到中断返回指令,从系统栈恢复被中断的上下文,cpu状态恢复为原来的状态,cpu开始一个新的指令周期
X86对中断/异常的支持
中断:是硬件信号引发的,可屏蔽和不可屏蔽中断
异常:指令执行引发的,除以0异常
系统调用:异常的一种,用户态到内核态的唯一入口
中断控制器(PIC)负责将硬件的中断信号转为中断向量,引发cpu中断
采用中断描述符表:用gate描述符数据结构表示中断向量,gate分为任务门,中断门,陷阱门,调用门
中断/异常的硬件处理过程:
确定中断/异常关联的向量i;通过IDTR寄存器找到IDT表,获得中断描述符(表中的第i项),从GDRT寄存器获得GDT的地址;结合中断描述符中的段选择符,在GDT表中获得对应的段描述符,从该段描述符中获得中断/异常处理程序所在的段基址,特权级检查,如果发现变化,进行堆栈切换(必须使用与新的特权级相关的栈),保存上下文到栈中,通过中断描述符中的段内偏移量和段描述符中的基地址,找到程序入口地址,执行第一条指令
系统调用机制
系统调用:在用户在编程时,可以调用操作系统功能,系统调用的操作系统提供给编程人员的唯一接口,使CPU状态从用户态转为内核态
中断/异常机制 支持系统调用服务的实现 选择一条特殊指令:陷入指令(亦称访管指令)引发异常,完成用户态到内核态的切换 ②系统调用号和参数 每个系统调用都事先给定一个编号(功能号)系统调用表存放系统调用服务例程的入口地址
cpu执行特殊的陷入指令时:
中断/异常机制:硬件保护现场,通过查中断向量表,控制权转给系统调用入口程序
系统调用总入口程序:保存现场,将参赛保存在内核栈,通过查系统调用表把控制权转给相应的系统处理历程,执行系统调用历程,恢复现场,返回用户程序
linux系统调用的实现
陷入指令选择128号;
int $0x80
门描述符,系统初始化,对IDT表的128号门初始化,门描述符的2,3两个字节:内核代码选择符,0,1,6,7四个字节:偏移量(指向system_call())
门类型:陷阱门
由于特权级的改变:用户栈->内核栈,cpu从任务状态段TSS中装入新的栈指针,指向内核栈
用户栈指针,用户态CS,EIP寄存器的内容压栈,用128在IDT中找到该门描述符,从中找到段选择符装入代码段寄存器CS
,代码段描述符的基地址+陷阱门描述符中的偏移量->定位systemcall()的入口地址
1 . 硬件压栈: 程序计数器等
2. 硬件从中断向量装入新的程序计数器等
3. 汇编语言过程保存寄存器值
4. 汇编语言过程设置新的堆栈
5. C语言中断服务程序运行(例: 读并缓冲输入)
6. 进程调度程序决定下一个将运行的进程
7. C语言过程返回至汇编代码
8. 汇编语言过程开始运行新的当前进程
---恢复内容结束---