操作系统原理(二) —— 运行环境与运行机制

处理器状态

  • 内核态 (Kernel Mode):运行操作系统程序。
  • 用户态 (User Mode):运行用户程序。
  • 用户态 → 内核态:中断/异常/陷入机制。
  • 内核态 → 用户态:设置程序状态字 PSW。
  • 特权指令 :只能由操作系统使用、用户程序不能使用的指令。
  • 非特权指令 :用户程序可以使用的指令。

中央处理器

  • 处理器由运算器控制器、一系列的寄存器以及高速缓存构成。
  • 两类寄存器

    • 用户可见寄存器:高级语言编译器通过优化算法分配并使用之,以减少程序访问内存次数。
    • 控制和状态寄存器:用于控制处理器的操作,通常由操作系统代码使用。

控制和状态寄存器

  • 用于控制处理器的操作。
  • 在某种特权级别下可以访问、修改。
  • 常见的控制和状态寄存器

    • 程序计数器(PC :Program Counter ):记录将要取出的指令的地址。
    • 指令寄存器(IR :Instruction Register ):记录最近取出的指令。
    • 程序状态字(PSW :Program Status Word ):记录处理器的运行状态,如条件码 、模式、控制位。在 PSW 中专门设置一位,根据运行程序对资源和指令的使用权限而设置不同的 CPU 状态。

中断与异常机制

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

主要作用

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

概念

  • CPU 对系统发生的某个事件做出的一种反应。
  • CPU 暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序。
  • 中断:外部事件,正在运行的程序所不期望的。
  • 异常:由正在执行的指令引发。

操作系统原理(二) —— 运行环境与运行机制

工作原理

  • 硬件的工作(中断/异常响应):捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序。
  • 软件的工作(中断/ 异常处理程序):识别中断/异常类型并完成相应的处理操作

操作系统原理(二) —— 运行环境与运行机制

  • 中断向量:一个内存单元,存放中断处理程序入口地址和程序运行时所需的处理机状态字。执行流程按中断号/异常类型的不同,通过中断向量表转移控制权给相应的中断处理程序。

    操作系统原理(二) —— 运行环境与运行机制
    操作系统原理(二) —— 运行环境与运行机制

中断响应示意图

操作系统原理(二) —— 运行环境与运行机制

中断处理程序

  • 设计操作系统时,为每一类中断/异常事件编好相应的处理程序,并设置好中断向量表。
  • 系统运行时若响应中断,中断硬件部件将 CPU 控制权转给中断处理程序:

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

系统调用

  • 用户在编程时可以调用的操作系统功能
  • 是操作系统为用户态运行的进程硬件设备进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层。可以说是操作系统留给用户程序的一个接口。
  • 每个操作系统都提供几百种系统调用(进程控制、进程通信、 文件使用、目录操作、设备管 理、信息维护等)。

系统调用和库函数之间的联系与区别

  • 系统调用所提供给用户的是直接而纯碎的高级服务,如果想要更加人性化,具有更符合特定情况的功能,那么就要我们用户自己定义,因此衍生了库函数,它把部分系统调用包装起来。比如当我们要用 C 语言打印一句话的时候,如果没有用到库函数printf,那么我们就需要自己实现就需要调用 putc() 和 write() 等这样一些系统函数。
  • 系统调用是为了方便使用操作系统的接口,而库函数则是为了人们编程的方便。
  • 在移植性方面,不同操作系统的系统调用一般是不同的,移植性差;而在所有的ANSI C编译器版本中,C库函数是相同的。

执行过程

当 CPU 执行到特殊的陷入指令时:

  • 中断/异常机制

    • 硬件保护现场
    • 通过查中断向量表把控制权转给系统调用总入口程序
  • 系统调用总入口程序

    • 保存现场
    • 将参数保存在内核堆栈里
    • 通过查系统调用表把控制权转给相应的系统调用 处理例程或内核函数
  • 执行系统调用例程
  • 恢复现场,返回用户程序

相关推荐