2.操作系统运行环境和运行机制

 

2.1处理器状态

中央处理器(CPU):由运算器控制器、一系列的寄存器高速缓存构成。

两类寄存器:

  1. 用户可见寄存器:高级语言编译器通过优化算法分配并使用之,以减少程序访问内存次数;
  2. 控制和状态寄存器:用于控制处理器的操作,通常由操作系统代码使用。
  • 用于控制处理器的操作
  • 在某种特权级别下可以访问、修改

常见的控制和状态寄存器:

  • 程序计数器:记录将要取出的指令的地址
  • 指令寄存器:记录最近取出的指令
  • 程序状态字:记录处理器的运行状态如条件码、模式、控制位等信息

操作系统对硬件的需求——保护:需要硬件提供基本运行机制:

  1. 处理器具有特权级别,能在不同的特权级运行的不同指令集合;
  2. 硬件机制可将os与用户程序隔离。

因此,现代处理器通常将CPU状态设计划分为两种、三种或四种。在程序状态字寄存器PSW中专门设置一位,根据运行程序对资源和指令的使用权限而设置不同的CPU状态。

操作系统需要两种CPU状态:

  1. 内核态:运行操作系统程序——特权指令:只能由操作系统使用,用户程序不能使用的指令;
  2. 用户态:运行用户程序——非特权指令:用户程序可以使用的指令。

CPU状态之间的转换:

  1. 用户态——>内核态:唯一途径——>中断/异常/陷入机制,其中陷入指令又称访管指令,提供给用户程序的接口,用于调用操作系统的功能。例如(int,trap,syscall)
  2. 内核态——>用户态:设置程序状态字PSW

 2.2中断与异常机制

操作系统是由“中断驱动 ”或者“事件驱动”的。

中断/异常机制主要作用:

  1. 及时处理设备发来的中断请求;
  2. 可使OS捕获用户程序提出的服务请求;
  3. 防止用户程序执行过程中的破坏性活动。    

中断/异常的概念:CPU对系统发生的事件作出的一种反应。

中断的引入是为了支持CPU和设备之间的并行操作,设备完成输入/输出后,通过向CPU发送中断报告此次结果。

异常的引入是表示CPU执行命令时本身出现的问题。如算术溢出、除零、取数时的纠错,这时硬件改变了CPU的执行流程,转到相应的错误处理程序或异常处理程序或执行系统调用。       

事件:

1、中断(外中断)

  • I/O中断
  • 时钟中断
  • 硬件故障   

2、异常(内中断)        

  • 系统调用
  • 页故障/页错误
  • 保护性异常
  • 断点指令
  • 其他程序性异常(如算术溢出等)

2.3中断/异常机制工作原理

中断/异常机制:硬件和软件相互配合而使计算机系统得以充分发挥能力。

硬件——中断/异常响应:捕获中断源发出的中断/异常请求,以一定方式响应,将处理器的控制权交给特定的处理程序。

软件——中断/异常处理程序:识别中断/异常类型并完成相应的处理。

中断响应:发现中断、接受中断的过程,由中断硬件部件完成。

处理器控制部件中设有中断寄存器。

中断响应过程:开始——>取下一条指令——>执行指令

中断向量表:由若干中断向量组成,即若干内存单元,存放中断处理程序入口地址和程序运行时所需的处理机状态字

中断处理程序:设计操作系统时,为每一类中断/异常事件编号相应的处理程序,并设置好中断向量表。

系统运行时若响应中断,终端硬件部件将CPU控制权转给中断处理程序:

  1. 保存相关寄存器信息
  2. 分析中断/异常的具体原因
  3. 执行对应的处理功能
  4. 恢复现场,返回被事件打断的程序。

2.4 X86处理器的中断/异常机制

中断:由硬件信号引发,分为可屏蔽中断和不可屏蔽中断。

异常:由指令执行引发的,比如除零异常,80X86处理器发布了大约20种不同的异常,对于某些异常,CPU会在执行异常处理程序之前产生硬件出错码,并压入内核态堆栈。

系统调用:特殊异常,从用户态到内核态的唯一入口

中断控制器(PIC或APIC):负责将硬件的中断信号转换为中断向量,并引发CPU中断。

实模式:中断向量表,存放中断服务程序的入口地址。入口地址=段地址左移4位+偏移地址;不支持CPU运行状态切换;中断处理与一般的过程调用相似。

保护模式:中断向量表改为中断描述符表,采用门描述符数据结构表示中断向量。

中断向量表/中断描述符表:

  • 任务门
  • 中断门:
  1. 给出段选择符,中断/异常程序的段内偏移量
  2. 通过中断门后系统会自动禁止中断
  • 陷阱门:a.与中断门类似,但通过陷阱门后系统不会自动禁止中断。
  • 调用门

中断/异常的硬件处理过程:

  1. 确定与中断或异常关联的向量i;
  2. 通过IDTR寄存器找到IDT表,获得中断描述符;
  3. 从GDTR寄存器获得GDT的地址;结合中断描述符中的段选择符,在GDT表获取对应的段描述符;从该段描述符中得到中断或异常处理程序所在的段基址;
  4. 特权级检查;
  5. 检查是否发生了特权级的变化,如果是,则进行堆栈切换(必须使用与新的特权级相关的栈)
  6. 硬件压栈,保存上下文环境;如果异常产生了硬件出错码,也将它保存在栈中;
  7. 如果是中断,清IF位;
  8. 通过中断描述符中的段内偏移量和段描述符中的基地址,找到中断/异常处理程序的入口地址,执行其第一条指令。

2.5系统调用机制——操作系统向用户程序提供的接口

系统调用:用户在编程时可以调用的操作系统功能。

系统调用的作用:

  1. 系统调用是操作系统提供给编程人员的唯一接口;
  2. 使CPU状态从用户态陷入内核态。

典型系统调用举例:每个操作系统都提供几百种系统调用(进程控制、进程通信、文件使用、目录操作、设备管理、信息维护等)

系统调用机制的设计:

  1. 中断/异常机制:支持系统调用服务的实现
  2. 选择一条特殊指令:陷入指令(亦称访管指令):引发异常,完成用户态到内核态的切换
  3. 系统调用号和参数:每个系统调用都事先给定一个编号(功能号)
  4. 系统调用表:存放系统调用服务例程的入口地址

参数传递过程问题:常用以下三种方法实现用户程序的参数传递给内核 :

  1. 陷入指令自带参数:陷入指令的长度有限,且还要携带系统调用功能号,只能自带有限的参数;
  2. 通过通用寄存器传递参数:这些寄存器是操作系统和用户程序都能访问的,但寄存器的个数会限制传递参数的数量,常用;
  3. 在内存中开辟专用堆栈区来传递参数。

系统调用的执行过程:当CPU执行到特殊的陷入指令时:

  1. 中断/异常机制:硬件保护现场,通过查中断向量表,把控制权转给系统调用总入口程序;
  2. 系统调用总入口程序:保存现场,将参数保存在堆栈里,通过查系统调用表把控制权转给相应的系统处理例程或内核函数;
  3. 执行系统调用例程
  4. 恢复现场,返回用户程序。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值