# 操作系统的运行机制

  • 应用程序:普通程序员编写的程序就是 "应用程序"

  • 内核程序:实现操作系统的程序就是内核程序。由很多内核程序组成了 "操作系统内核",或简称内核。内核是操作系统最重要最核心的部分,也是最接近硬件的部分

操作系统的功能未必都在内核中,如图形化界面 GUI

  • 特权指令
    • 操作系统内核作为 "管理者",有时会让 CPU 执行一些 "特权指令",如:内存清零指令。这些指令影响重大,只允许 "管理者"—— 即操作系统内核来使用
  • 非特权指令
    • 应用程序使用的指令即为 "非特权指令",如:加法指令、减法指令等

在 CPU 设计和生产的时候就划分了特权指令和非特权指令,因此 CPU 在执行一条指令前就能判断出其类型

  • 内核态
    • 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
  • 用户态
    • 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令

拓展:CPU 中有一个寄存器叫程序状态寄存器 (PSW),其中有个二进制位,1 表示内核态,0 表示用户态

别名:内核态 = 核心态 = 管态;用户态 = 目态

# 内核态、用户态的切换

内核态 -> 用户态:执行一条特权指令 —— 修改 PSW 的标志位为用户态,这个动作意味着操作系统将主动让出 CPU 使用权

用户态 -> 内核态:由中断引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回 CPU 的使用权

注:除了非法使用特权指令外,还有很多事件会触发中断信号。一个共性是,但凡需要操作系统介入的地方,都会触发中断信号

# 中断和异常

中断的作用:

  • 让操作系统内核强行夺回 CPU 的控制权
  • 让 CPU 从用户态变为内核态

# 中断

内中断

与当前执行的指令有关,中断信号来源于 CPU 内部(陷阱、陷入、故障、终止)

例子:

  • 在用户态下执行特权命令
  • 执行除法指令时发现除数为 0
    • 若当前执行的指令是非法的,则会引发一个中断信号
  • 程序请求操作系统内核的服务,会执行一条特殊的指令 —— 陷入指令,该指令会引发一个内部中断信号
    • 执行陷入指令,意味着应用程序主动地将 CPU 控制权还给操作系统内核。"系统调用" 就是通过陷入指令完成的

外中断

与当前执行的指令无关,中断信号来源于 CPU 外部

例子:

  • 时钟中断 —— 由时钟部件发来的中断信号
  • I/O 中断请求

内中断一般称为异常,外中断就是狭义的中断

中断机制的基本原理

不同的中断信号,需要用不同的中断处理程序来处理。当 CPU 检测到中断信号后,会根据中断信号的类型去查找 "中断向量表",以此来找到相应的中断处理程序在内存中的存放位置

# 系统调用

操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。

系统调用是操作系统提供给应用程序 (程序员 / 编程人员) 使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求系统内核的服务

系统调用与库函数区别

从下往上依次层次增加

普通应用程序可直接进行系统调用,也可使用库函数。有的库函数涉及系统调用,有的不涉及
编程语言向上提供库函数,有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使程序员更加方便
操作系统向上提供系统调用,使得上层程序能请求内核的服务
裸机

为什么系统调用是必须的

由操作系统内核对共享资源进行统一的管理,并向上提供 "系统调用",用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求。内核对各个请求进行协调处理

系统调用

  • 设备管理:完成设备的请求 / 释放 / 启动等功能
  • 文件管理:完成文件的读 / 写 / 创建 / 删除等功能
  • 进程控制:完成进程的创建 / 撤销 / 阻塞 / 唤醒等功能
  • 进程通信:完成进程之间的消息传递 / 信号传递等功能
  • 内存管理:完成内存的分配 / 回收等功能

应用程序通过系统调用请求操作系统的服务。而系统中各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作 (如存储分配、I/O 操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作

系统调用过程

传递系统调用参数 -> 执行陷入命令 (用户态)-> 执行相应的内请求核程序处理系统调用 (核心态)-> 返回应用程序

注意:

  • 陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,是 CPU 进入核心态
  • 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行

# 操作系统的体系结构

计算机系统的层次结构

# 操作系统的内核

内核是操作系统最基本、最核心的部分。

实现操作系统内核功能的那些程序就是内核程序

操作系统内核:

  • 时钟管理:实现计时功能
  • 中断处理:负责实现中断机制
  • 原语:
    • 是一种特殊的程序
    • 处于操作系统的最底层,是最接近硬件的部分
    • 这种程序的运行具有原子性 —— 其运行只能一气呵成,不可中断
    • 运行时间较短、调用频繁
  • 对系统资源进行管理的功能
    • 进程管理
    • 存储器管理
    • 设备管理

注:上三条是与硬件关联较紧凑的模块,最后一条的管理工作更多是对数据结构的操作,不会直接涉及硬件

操作系统两种体系结构

两种体系结构

大内核:

  • 将操作系统的主要功能模块都作为系统内核,运行在核心态
  • 优点:高性能
  • 缺点:内核代码庞大,结构混乱,难以维护

微内核:

  • 只把最基本的功能保留在内核
  • 优点:内部功能少,结构清晰,方便维护
  • 缺点:需要频繁地在核心态和用户态之间切换,性能低

操作系统结构

操作系统结构

注:标星号的重点关注

# 操作系统引导

操作系统的引导(开机过程):

  • CPU 从一个特定主存地址开始,读指令,执行 ROM 中的引导程序 (先进行硬件自检,再开机)
  • 将磁盘的第一块 —— 主引导记录读入内存,执行磁盘引导程序,扫描分区表
  • 从活动分区 (又称主分区,即安装了操作系统的分区) 读入分区引导记录,执行其中的程序
  • 从根目录下找到完整的操作系统初始化程序 (即启动管理器) 并执行,完成 "开机" 的一系列动作

例:Windows 操作系统的初始化程序可在 "根目录 / Windows/Boot" 下找到

# 虚拟机

虚拟机:使用虚拟技术,将一台物理机器虚拟化为多台虚拟机器,每个虚拟机器都可以独立运行一个操作系统

同义术语:虚拟机管理程序 / 虚拟机监控程序

第一类 VMM,直接运行在硬件上

第二类 VMM,运行在宿主操作系统上

两类虚拟管理程序 (VMM) 的对比

第一类 VMM第二类 VMM
对物力资源的控制权直接运行在硬件之上,能直接控制和分配物理资源运行在 Host OS 之上,依赖于 Host OS 为其分配物力资源
资源分配方式在安装 Guest OS 时,VMM 要在原本的硬盘上自行分配存储空间,类似于 "外核" 的分配方式,分配未经抽象的物理操作Guest OS 拥有自己的虚拟内核,该盘实际上时 Host OS 文件系统中的一个大文件,Guest OS 分配到的内存是虚拟内存
性能性能更好性能更差,需要 HostOS 作为 "中介"
可支持的虚拟机数量更多,不需要和 Host OS 竞争资源,相同的硬件资源可以支持更多的虚拟机更少,Host OS 本身需要使用物理资源,Host OS 上运行的其他程序也需要物理资源
虚拟机的可迁移性更差更好,只是导出虚拟机镜像文件即可迁移到另一台 HostOS 上,商业化应用更广泛
运行模式第一类 VMM 运行在最高特权级,可以执行最高特权的指令第二类 VMM 部分运行在用户态,部分运行在内核态,Guest OS 发出的系统调用会被 VMM 截获,并转化为 VMM 对 HostOS 的系统调用