现代操作系统-操作系统运行环境与运行机制

---恢复内容开始---

应用程序

------------------- 虚拟机器界面

操作系统

-----------------物理机器界面

硬件

 

操作系统的运行环境为 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()的入口地址

 

 

. 硬件压栈: 程序计数器等
2. 硬件从中断向量装入新的程序计数器等
3. 汇编语言过程保存寄存器值
4. 汇编语言过程设置新的堆栈
5. C语言中断服务程序运行(例: 读并缓冲输入)
6. 进程调度程序决定下一个将运行的进程
7. C语言过程返回至汇编代码
8. 汇编语言过程开始运行新的当前进程

 

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---

posted on 2015-11-15 20:41  笨拙的菜鸟  阅读(3146)  评论(0编辑  收藏  举报

导航