2、操作系统运行环境与运行机制1(操作系统笔记)

一、回顾:操作系统的主要工作

  • 程序的执行
    启动程序、执行程序以及程序结束的工作

  • 完成与体系结构相关的工作

  • 完成应用程序所需的共性任务
    提供各种基本服务,如IO、网络等。

  • 处理性能、安全、健壮等问题

二、处理器状态(模式)

2.1 中央处理器(CPU)

1、处理器由运算器、控制器、一些列的寄存器以及高速缓存构成

2、两类寄存器

  • 用户可见寄存器
    高级语言编译器通过优化算法并使用之,以减少程序访问内存次数

  • 控制和状态寄存器
    用于控制处理器的操作,通常由操作系统代码使用

2.2 控制和状态寄存器

  • 用于控制处理器的操作

  • 在某种特权级别下可以访问、修改

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

    • 程序计数器(PC:Program Counter),记录将要取出的指令的地址
    • 指令寄存器(IR:Instruction Register),记录最近取出的指令
    • 程序状态字(PSW:Program Status Word),记录处理器的运行状态如条件码、模式、控制位等信息

2.3 操作系统的需求:保护

  • 从操作系统的特征考虑:并发、共享
    操作系统可能同时运行多个用户程序,这是一个多进程并发的状态,对于用户程序之间某些不需要共享的资源我们需要对其进行保护,保证每个用户程序相对于其他程序的独立性。

  • 需要硬件提供基本的运行机制

    • 处理器具有特权级别:能在不同的特权级别运行的不同指令集合
    • 硬件机制可将操作系统与用户程序隔离

2.4 处理器的状态

  • 现代处理器通常将CPU状态设计划分为两种、三种和四种

  • 在程序状态字寄存器PSW中专门设置一位,根据运行程序对资源和指令的使用权限而设置不同的CPU状态。

2.5 特权指令和非特权指令

1、操作系统需要两种CPU状态

  • 内核态(Kernel Mode):运行操作系统
  • 用户态(User Mode):运行用户程序

2、特权指令
只能由操作系统使用、用户程序不能使用的指令。如:
启动I/O、内存清零、修改程序状态字、设置时钟、允许/禁止中断、停机

3、非特权指令
用户程序可以使用的指令,同时操作系统也能使用。如:
控制转移、算术运算、取数指令、访管指令

4、实例:X86系列处理器

  • x86支持四个处理器特权级别:R0、R1、R2、R3
    特权能力依次降低,其中R0相当于内核态,R3相当于用户态,R1、R2则介于两者之间。不同级别能够运行的指令集合大小不同。

  • 目前大多数基于x86处理器的操作系统一般只是使用R0R3这两个特权级别。

2.6 CPU状态之间的转换

  • 用户态 ---> 内核态
    唯一途径:中断、异常、陷入机制(即系统调用)

  • 内核态 ---> 用户态
    途径:设置程序状态字PSW

  • 注意一条特殊的指令:陷入指令(又称访管指令,访问管理模式),提供给用户程序的接口,用于调用操作系统的功能(服务),例如:int, trap(陷入), syscall, sysenter/sysexit

三、中断与异常机制

中断/异常对于操作系统的重要性就好比汽车的发动机,可以说操作系统是由“中断驱动”或“事件驱动”的。其主要作用有:

  • 及时处理设备发来的中断请求
  • 可使操作系统捕获用户程序提出的服务请求
  • 防止用户程序执行过程中的破坏性活动等等

3.1 概念

  • CPU对系统发生的某个事件做出的一种反应,或者说事件的发生改变了处理器的控制流。
  • CPU暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序。其特点是:随机发生、自动处理、可恢复。

3.2 为什么引入中断与异常

  • 中断的引入:为了支持CPU和设备之间的并行操作
    CPU启动设备进行输入/输出后,设备便可以独立工作,CPU转去处理与此次输入/输出无关的事情;当设备完成输入/输出后,通过向CPU发送中断报告此次输入/输出的结果,让CPU决定如何处理以后的事情。

  • 异常的引入:表示CPU执行指令时本身出现的问题
    如算术溢出、除零、取数时的奇偶错误,访问存储地址越界或执行了“陷入指令”等,这时硬件改变了CPU当前的执行流程,转到相应的错误程序或异常处理程序或执行系统调用。

3.3 事件

事件分为两类:

  • 中断(外中断),如I/O中断、时钟中断、硬件故障。中断表示外部事件,是正在运行的程序所不期望的。

  • 异常(内中断),如系统调用、页故障/页错误、保护性异常、断点指令、其他程序性异常(如算术溢出等)。这是由正在执行的指令自己引发的。

3.4 小结

类别 原因 异步/同步 返回行为
中断(Interrupt 来自I/O设备、其他硬件部件 异步 总是返回到下一条指令
陷入(Trap 有意识安排的 同步 返回到下一条指令
故障(Fault 可恢复的错误 同步 返回到当前指令
终止(Abort 不可恢复的错误 同步 不会返回

3.5 中断/异常机制的工作原理

  • 中断/异常机制是现代计算机系统的核心机制之一
    硬件和软件相互配合而使计算机系统得以充分发挥能力

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

  • 软件做什么:中断/异常处理程序
    识别中断/异常类型并完成相应的处理

3.5.1 中断响应

中断响应中发现中断、接收中断的过程由中断硬件部件完成,在处理器控制部件中设有中断寄存器。其过程如下:

2、操作系统运行环境与运行机制1(操作系统笔记)_第1张图片
1

说明:检查是否有中断信号是在每条指令之间进行的。这里的中断向量表是一个软硬件结合的数据结构。通过中断码去查中断向量表找到中断处理程序地址。

中断向量表

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


    2、操作系统运行环境与运行机制1(操作系统笔记)_第2张图片
    2

    事先编写好中断处理程序,然后由操作系统填写中断向量表,当中断发生时会按照执行流程按中断号/异常类型的不同,通过中断向量表转移控制权给中断处理程序。

例:Linux中的中断向量表

2、操作系统运行环境与运行机制1(操作系统笔记)_第3张图片
3

3.5.2 中断响应过程

2、操作系统运行环境与运行机制1(操作系统笔记)_第4张图片
4

说明:从最右边可以看到一个最简略的中断响应过程。

3.6 中断处理程序

以上都是中断处理的硬件部分内容,下面看软件部分内容。

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

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

    • 保护相关寄存器信息:在刚才的图中硬件部件会保存一些关键信息,而其他的一些信息则是由软件进行保护的。
    • 分析中断/异常的具体原因
    • 执行对应的处理功能
    • 恢复现场,返回被事件打断的程序。

3.7 小结

软件提前设置好,硬件部件来执行。以设备输入输出为例来回顾一下中断运行机制:

  • 打印机给CPU发中断信号

  • CPU处理完当前指令后检测到中断,判断出中断来源并向相关设备发出确认信号,这是由硬件部件来完成的。

  • CPU开始为软件处理中断做准备:

    • 处理器状态切换到内核天
    • 在系统栈中保存被中断程序的重要上下文环境,主要是程序计数器PC、程序状态字PSW
  • CPU根据中断码查询中断向量表,获得与该中断相关的处理程序的入口地址,并将PC设置成地址,新的指令周期开始时,CPU控制转移到中断处理程序。这是由硬件来完成的。

  • 中断处理程序开始工作

    • 在系统栈中保存现场信息
    • 检查I/O设备的状态信息,操作I/O设备或者在设备和内存之间传送数据等等。这是由软件来完成的。
  • 中断处理结束时,CPU检测到中断返回指令,从系统栈中恢复被中断程序的上下文环境,CPU状态恢复成原来的状态,PSWPC恢复成中断前的值,CPU开始一个新的指令周期。这是由硬件来完成的。

例:I/O中断处理程序
中断处理程序都做了什么:

  • I/O操作正常结束

    • 若有程序正等待此次I/O的结果,则应将其唤醒
    • 若要继续I/O操作,需要准备好数据重新启动I/O
  • I/O出现错误

    • 需要重新执行失败的I/O操作
    • 重试次数有上限,达到时系统将判定硬件故障

例:x86对中断/异常的支持
1、中断
由硬件信号引发的,分为可屏蔽和不可屏蔽中断

2、异常

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

3、系统调用
异常的一种,用户态到内核态的唯一入口

4、中断控制器(PICAPIC
负责将硬件的中断信号转换为中断向量,并引发CPU中断

5、实模式:中断向量表(Interrupt Vector
存放中断服务程序的入口地址:

  • 入口地址=段地址左移四位+偏移地址
  • 不支持CPU运行状态切换
  • 中断处理与一般的过程调用相似

6、保护模式:中断描述符表(Interrupt Descriptor Table
现在一般都是工作在保护模式下,此中模式下采用门(gate)描述符数据结构表示中断向量,同时中断描述符表和中断向量表其实本质上是一样的。

7、中断向量表/中断描述符表

  • 四种类型门描述符
    • 任务门(Task Gate

    • 中断门(Interrupt Gate):1、给出段选择符(Segment Selector)、中断/异常程序的段内偏移量(Offset);2、通过中断门后系统自动禁止中断

    • 陷阱门(Trap Gate
      与中断门类似,但通过陷阱门后系统不会自动禁止中断

    • 调用门(Call Gate

一般我们只用中断门和陷阱门。

  • 一些具体的数据结构和响应过程
    2、操作系统运行环境与运行机制1(操作系统笔记)_第5张图片
    5

    说明:通过中断描述符表寄存器IDTR找到中断描述符表IDT地址,中断描述符表的每一个数据为中断描述符或将中断向量,其格式如图。通过中断描述符可以得到一个段选择符,可以看到有一个索引、特权级和GDT/LDT,其中GDT表示全局描述符表,LDT表示局部描述符表。通过全局描述符表寄存器GDTRGDT表中查找得到一个段描述符,重要的是得到了一个段基址,然后加上中断描述符中的段偏移就得到了中断服务程序的入口地址。其具体过程如下:
    • 确定与中断或异常关联的向量i
    • 通过IDTR寄存器找到IDT表,获得中断描述符(表中的第i项)
    • GDTR寄存器获得GDT的地址;结合中断描述符中的段选择符,在GDT表获取对应的段描述符;从该段描述符中得到中断或异常处理程序所在的段基址
    • 特权级检查
    • 检查是否发生了特权级的变化,如果是,则进行堆栈切换(必须使用与新的特权级相关的栈)
    • 硬件压栈,保存上下文环境;如果异常产生了硬件出错码,也将它保存在栈中
    • 如果是中断,清掉IF
    • 通过中断描述符中的段内偏移和段描述符中的基地址,找到中断/异常处理程序的入口地址,执行其第一条指令。


      2、操作系统运行环境与运行机制1(操作系统笔记)_第6张图片
      6

你可能感兴趣的:(2、操作系统运行环境与运行机制1(操作系统笔记))