操作系统运行环境

175 阅读16分钟

处理器

处理器的构成与基本工作方式

  • 运算器

    实现指令中的算术和运算逻辑,是处理器的核心

  • 控制器

    负责控制程序运行的流程,包括取指令、维护处理器状态、处理器与内存的交互

  • 寄存器

    一种暂时存储组件,用于处理器执行指令的过程中暂存数据、地址和指令信息

    • 用户寄存器

      对所有应用程序都是可用的,由机器语言直接引用。一般包括

      • 数据寄存器

        又称通用寄存器,用于各种算术逻辑指令和访存指令

      • 地址寄存器

        用于存储数据及指令的物理地址、线性地址和有效地址,用于某种特定方式的寻址

      • 条件码寄存器

        保存处理器操作结果的各种标记位,这些标记在条件分支指令中被测试,以控制程序指令的流向

    • 控制和状态寄存器

      • 程序计数器(Program Counter PC)

        记录将要取出的指令

      • 指令寄存器(Instruction Register IR)

        包含最近取出的指令

      • 程序状态字(Program Status Word PSW)

        记录处理器的运行模式信息

  • 高速缓存

指令执行的基本过程

首先,处理器从存储器中读取一条指令,在取指令完成后,自动将程序计数器的值变成下一条指令的地址(一般是自增 1),然后,取到的指令放在指令寄存器中,处理器解释并执行这条指令。一个这样的单条指令处理过程成为一个指令周期

指令大概可以分为五大类

  • 访问存储器指令,负责处理器和存储器之间的数据传送
  • I/O 指令,负责处理器和 I/O 模块之间的数据传送和命令发送
  • 算术逻辑指令(数据处理指令),执行有关数据的算术和逻辑操作
  • 控制转移指令,可以指定一个新的指令的执行起点
  • 处理器控制指令(PSW),用于修改处理器状态,改变处理器工作方式
特权指令和非特权指令

在多用户或多任务的多道程序设计环境中,指令分为特权指令和非特权指令

  • 特权指令

    只能由操作系统使用的指令(设置程序状态字、启动某设备、设置中断屏蔽、设置时钟指令、清内存指令、建立存储保护指令等)

  • 非特权指令

    一般用户可使用的指令,如果用户进程需要用到特权指令,将引起一次处理器状态的切换,处理器状态将切换到操作系统运行的特权状态,然后将处理权移交给操作系统中的一段特殊代码。这个过程成为陷入(Trap)

管态和目态

处理器执行操作系统程序管理程序时处于管态,执行用户程序时处于目态,当处于管态时可以执行一切包括特权指令在内的指令,处于目态时不允许执行特权指令。在操作系统运行过程中,这两种状态是随时相互转换的

  • 目态到管态的转换

    唯一途径是通过中断。中断响应时交换中断向量,新的中断向量中的 PSW 的处理器状态位标志为管态

  • 管态到目态的转换

    通过设置 PSW 指令(修改程序状态字)

程序状态字(PSW)

用来表明处理器当前的工作状态。

处理器的状态字(PSW)通常包括以下状态代码

  • CPU 的工作状态代码——指明当前处理器的工作状态是管态还是目态,用来说明当前执行者是操作系统还是一般用户,从而决定是否有特权指令的执行权限
  • 条件码——反映指令执行后的结果特征
  • 中断屏蔽码——指出是否允许中断

计算机硬件系统部件

存储系统

类型
  • 读写型的存储器(RAM)

    采用层次化的存储体系结构,分为三层,每层容量和速率不同,容量越小,速度越快

  • 只读型的存储器(ROM)

    比如 BIOS程序就是固定在主板上的只读存储器

存储器保护

image-20231207155608810.png

界地址寄存器。是指在处理器中设置一对界限寄存器来存储该用户作业在内存中的上限(上限寄存器)和下限(下限寄存器)地址,也可将一个寄存器作为基址寄存器,另一个作为限长寄存器(指示存储区长度)的方法来指出程序在内存中的存储区域。每当处理器访问内存时,硬件自动将访问的内存地址与界限寄存器的内容进行比较,判断是否越界,否则将产生程序中断——越界中断或存储保护中断

I/O 部件

  • I/O 结构

    在早期计算机系统中,外部设备的控制器通过 I/O 硬件结构直接与处理器连接,对设备的控制是由处理器发出指令来实现的,在这种方法中,主要缺陷是处理器需要关注I/O设备控制器的状态,浪费大量性能,已经淘汰

  • 通道

    独立于中央处理器,专门负责数据 I/O 传输工作的处理单元,各个外部设备均配有相应的设备控制器,再通过通道连接在计算机系统的公共系统总线上。

    通道对外部设备实行统一管理,代替了处理器对设备直接操作,从而使处理器和设备可以并行工作,所以通道又称为 I/O 处理器

    工作原理:

    • 处理器按顺序执行指令,当处理器执行到一条“启动外设”(启动 I/O)的指令时,就由指令中给定的参数启动设备。

    • 设备启动后,对该设备的控制权转移到通道,由通道控制设备有关操作,设备与内存之间发生的信息传递由通道负责,而处理器继续执行指令,这时处理器和外部设备工作是并行的。

    • 外部设备工作结束后,会产生一个“输入输出结束操作”的 I/O 中断事件。因为设备是由处理器根据程序要求启动的,所以依然由操作系统的处理程序处理这个 I/O 中断事件。

  • DMA技术(Direct Memory Access DMA)

    直接存储器访问,通过系统总线中的一个独立控制单元——DMA 单元,自动控制成块数据在内存和 I/O 单元之间传送。当处理器需要读写一整块数据的时候,给 DMA发送一条命令,包含I/O 设备的编址、开始读或写的内存编址、需要传送的数据长度、是否请求一次读或写等信息。处理器给 DMA这条命令后,就可以继续执行其他命令。 DMA 将自动管理整块数据发送,传送完成后,会给处理器一个中断。

  • 缓冲技术

    用于外部设备和其他硬件部分之间的一种数据暂存技术,一般有两种用途,一是用在外部设备和外部设备之间的通信上,一种是用在外部设备和处理器之间。

    比如键盘输入数据,输入速度是很慢的,而处理器处理速度很快,这时先把数据送入键盘数据缓冲区,然后处理器再统一读取

    其实缓冲技术解决的最大问题就是:处理器处理数据速度和设备传输数据速度不匹配,需要用缓冲区缓解其间的速度矛盾

时钟部件

作用

  • 在多道程序运行的环境中,时钟可以为系统发现一个陷入死循环,从而防止机时浪费
  • 在分时系统中,用时钟间隔来实现各个作业按时间片轮转运行
  • 在实时系统中,按要求的时间间隔输出正确的事件信号给相关的实时控制设备
  • 定时唤醒要求按照事先给定的时间执行的各个外部事件(定时任务)
  • 记录绝对时间(年月日)

一般分为硬件时钟和软件时钟

  • 硬件时钟

    由电路中的晶体振荡器,每隔一定间隔产生固定脉冲频率,时钟电路中的时钟寄存器根据时钟电路产生的脉冲数,对时钟寄存器进行加 1 的工作

  • 软件时钟

    常用作相对时钟,工作原理是利用内存单元模拟时钟寄存器,模拟时钟功能

根据用途可以分为绝对时钟和相对时钟

  • 绝对时钟

    不受外界干扰、独立运行。

  • 相对时钟(间隔时钟)

    只计算从某一个时间初值开始的一段时间间隔,没经过一个单位的时间,时钟值自动减 1,直到为负时触发一个时钟中断,比如闹钟,会触发一个音响事件。

中断机制

中断与异常的概念

  • 中断

    处理器对系统中或系统外部发生的异步事件的响应。比如外部设备完成了数据传输任务,某一实时控制设备出现异常

    • 中断事件(中断源):引起中断的事件
    • 中断请求:中断源向处理器发出的请求信号
    • 中断处理程序:处理中断事件的程序
    • 中断断点:发生中断时正在执行的程序的暂停点
    • 中断响应:处理器暂停当前程序转而处理中断的过程
    • 中断返回:中断处理结束之后恢复原来程序的执行

    为了使中断装置可以找到恰当的中断处理程序,设计了中断向量表(中断处理程序入口地址映射表),主要是由 状态处理字(PSW)指令计数器(PC) 组成

  • 异常

    中断是由外部事件引发的,异常是由正在执行的指令引发

中断与异常的分类

中断

  • 时钟中断:处理器内部计时器产生,允许操作系统以一定规律执行函数,如时间片到时、硬件实时钟到时等
  • 输入输出(I/O)中断,由 I/O 控制器产生,用于通知一个 I/O 操作正常完成或者发生错误
  • 控制台中断:系统操作员通过控制台发出命令

异常

  • 程序性中断:在某些条件下由指令执行结果产生,如算术溢出、被零除、目态程序试图访问特权指令、访问不被允许访问的存储位置、虚拟存储中的缺页等
  • 访管指令异常:目的是要求操作系统提供系统服务

中断系统

流程可分为:接收和响应中断、保护中断断点现场、分析中断向量、调用中断处理程序、中断结束恢复现场、原有程序继续执行

中断系统分为 硬件中断装置软件中断处理程序

  • 硬件中断装置:负责捕获中断源发出的中断请求,以一定方式响应中断源,然后将控制权交给特定的中断处理程序
  • 中断处理程序:针对中断事件的性质执行相应的一系列操作
  1. 中断请求的接收

    通过硬件中的 中断逻辑线路 和 **中断寄存器 **实现

    中断逻辑线路接收中断信号,把中断信号寄存在线路中的硬件触发器中(中断寄存器),其中由若干个专门接收中断信号的触发器,每个触发器成为一个中断位。中断寄存器是由若干个中断位组成的

  2. 中断响应

    机制如下,处理器设置有中断信号扫描结构,在每条指令周期内的最后时刻扫描中断寄存器,看是否有中断信号。没有就继续执行下一个指令,有就接收硬件中断装置发来的中断装置向量代号。然后处理器保存中断点的程序上下文,便于中断程序结束后继续执行原程序。这个上下文环境一般包括 程序状态字(PSW)、程序计数器(PC)和一些寄存器的值,一般保存在专门的系统堆栈中。处理器状态此时切换为 管态

    处理器根据中断向量代号查询中断向量表,获得中断处理程序的入口地址,并把 PC 置成该地址,随后控制权转移给中断处理程序

    中断请求响应的工作过程:

    1. 处理器接收中断信号

    2. 保护现场,将中断断点的程序状态字(PSW)和程序计数器(PC)存入系统堆栈

    3. 分析中断向量,取得中断处理程序的入口地址

    4. 将处理器 PC 值设置为中断处理程序的入口地址

    5. 调用中断处理程序

      image-20231208140203447.png

  3. 中断处理

    控制权交给中断处理程序之后,中断处理程序开始工作,完成后处理器会检测到一条中断返回指令,在执行中断返回指令时,处理器会把原先被中断的程序的上下文环境从系统堆栈恢复,处理器状态也从管态切换回目态。整个中断处理结束

中断优先级、中断屏蔽与中断嵌套

  1. 多级中断的作用

    • 对各类中断信号依据其紧急程度和重要性划分级别
    • 如果有重要成都相当的多个中断信号同时到达时,如何选择首个被处理的中断信号的问题。如果在同一中断级中的多个设备接口中都有中断请求的话,一般采用:
      • 固定的优先数:给每个设备接口一个固定的优先顺序,比如靠近处理器越近优先级越高
      • 轮转法:依次轮转响应
  2. 中断屏蔽

    在程序状态字(PSW)中有 中断屏蔽位,来判断是否允许响应或禁止某些中断

    有一类中断信号是不可屏蔽的:机器故障中断,比如内存奇偶校验错误以及掉电

  3. 中断嵌套

    在一个中断处理过程中,如果又发生了中断,将引起多个中断处理问题,一般处理策略有两种

    • 当处理一个中断时禁止其他中断,系统对任何新发生的中断置之不理,这些新中断处于挂起状态。当处理器再次允许处理中断时,新的中断信号会被检测到,再处理(这种方法没有考虑到中断信号的紧急程度)
    • 中断嵌套,中断按照优先度分级,允许优先级高的中断打断优先级较低的中断处理过程,于是引起中断嵌套

    image-20231211111038969.png

系统调用

系统调用简介

系统调用命令是作为扩充机器指令、增强系统功能、方便用户使用

系统调用 与 函数调用 区别
  • 运行在不同的系统状态

    系统调用运行在管态,函数调用在目态。调用程序运行在目态,被调用程序运行在系统态(管态)

  • 状态的转换

    一般函数调用不涉及系统状态的转换,可直接从调用过程转向被调用过程;但在系统调用时,不允许从调用过程直接转向被调用过程,通常是通过软中断机制先从目态切换到管态,转向相应的系统调用处理子程序

  • 返回问题

    一般函数调用在调用过程执行完后,将返回到调用过程继续执行,但是在抢占式调度方式的系统中,被调用过程执行完后,系统对所有要求运行的进程进行优先级排序,如果调用进程依然具有最高优先级,则继续执行,否则将重新调度

  • 嵌套调用

    系统调用也允许嵌套调用,每个系统对嵌套调用的深度限制不同

系统调用的分类

系统调用分为系统本身所需要的 和 作为服务提供给用户的,提供的系统调用可分为:

  • 进程控制类系统调用

    主要用于对进程的控制,如创建或终止进程、获得和设置进程属性

  • 文件操作类系统调用

  • 进程通信类系统调用

  • 设备管理类系统调用

  • 信息维护类系统调用

系统调用与库函数、API、内核函数的关系

库函数与 API 的目的是让应用程序开发人员可以调用一组例程功能,而无需考虑底层源码以及内部工作机制细节

用户使用库函数和 API 来完成系统调用的执行,二者相当于系统调用的封装

image-20231211113414984.png

系统调用的处理过程

当处理器执行到特殊的陷入指令时,首先会调用中断,通过查中断向量表把控制权转给系统调用总入口程序,该程序会对现场进行保存,包括将参数保存在内核堆栈里,通过查系统调用表把控制权转给相应的系统调用处理例程或内核函数,然后执行系统调用例程,完成后恢复现场并返回用户程序

image-20231211115115822.png

有关系统调用的另一个问题是参数传递问题,不同系统调用需要传递给系统子程序不同的参数,而且系统调用的执行结果也要以参数的形式返回给用户程序。怎么实现用户程序和系统程序之间的参数传递呢:

  • 由陷入指令自带参数,一般一条陷入指令长度是有限的,而且还要带一个系统调用的功能号,因此陷入指令可传递的参数十分有限
  • 通过通用寄存器来传递参数(UNIX 类操作系统通常采用)
  • 在内存中开辟专用堆栈区传递参数