第三讲 基于特权级的隔离与批处理

第一节 从OS角度看计算机系统

向勇 陈渝 李国良 任炬

2024年春季


提纲

1. OS与硬件的关系

  1. OS与应用程序的关系
  2. 隔离机制

计算机系统

bg right:55% 100%

计算机系统(computer architecture)是一种抽象层次设计,用于实现可有效使用现有制造技术信息处理应用。 -- cs-152 berkeley


计算机系统抽象层次

硬件 支持 OS 支持 应用

bg right:52% 95%

  • 操作系统位于硬件(HW)和应用(APP)之间
  • 只有理解OS与HW/APP的关系,才能更好掌握OS

指令集:软硬件接口

硬件OS边界 :指令集+寄存器 w:1150


OS是对硬件的虚拟与抽象

bg 55%


RISC-V处理器架构

w:800


u/rCore的框架结构 w:900


提纲

  1. OS与硬件的关系

2. OS与应用程序的关系

  1. 隔离机制

OS对应用程序执行的支持

  • 提供服务

  • 系统调用

  • 地址空间布局


OS为应用程序提供服务

  • 通过系统调用来提供服务
  • 系统调用:OS/APP的接口(边界之一) w:1100

系统调用如何实现?

  • 调用ssize_t read(int fd, void *buf, size_t count);会发生什么?

  • 可以在应用程序中直接调用内核的函数吗?

  • 可以在内核中使用应用程序普通的函数调用吗?


引入系统调用的目的是增强安全性和可靠性

  • 函数调用的特征
    • 好处:执行很快;
    • 好处:灵活-易于传递和返回复杂数据类型;
    • 好处:程序员熟悉的机制,...
    • 坏处:应用程序不可靠,可能有恶意,有崩溃的风险

进程的地址空间

进程的地址空间(memory layout)是界定了OS/APP的边界w:850


OS内核与应用进程的地址空间划分

进程的地址空间(memory layout)是界定了OS/APP的边界w:600

内核页表隔离(KPTI, kernel page-table isolation)

w:600


提纲

  1. OS与硬件的关系
  2. OS与应用程序的关系

3. 隔离机制

  • 为什么隔离
  • 隔离要解决的问题
  • 隔离的方法

隔离要解决的问题

  • 防止程序 X 破坏或监视程序 Y

    • 读/写内存,使用 100%的 CPU,更改文件描述符
  • 防止进程干扰操作系统

  • 防止恶意程序、病毒、木马和 bug

    • 错误的过程可能会试图欺骗硬件或内核

什么是隔离?

  • 隔离的定义

    • 操作系统中的应用程序不会影响(或破坏)其他应用或操作系统的正常执行或信息泄露
  • 隔离的本质

    • 在需要交换信息或共享资源的情况下才出现
  • 隔离并不意味着不要共享


隔离边界

隔离需要建立边界(boundary)

  • 边界决定了各自的势力范围
    • 跨界即有风险的共享资源
  • 强制隔离
    • 避免有问题的单元对整个系统的安全影响
  • 隔离的单位
    • 通常是运行的程序

隔离方法

  • 隔离的方法分类
    • 基于软件的隔离
    • 基于硬件的隔离
    • 基于网络的隔离

OS隔离APP的分类

  • 控制的隔离:特权级机制
    • 用户态 vs 内核态
  • 数据的隔离:地址空间
    • 用户地址空间 vs 内核地址空间
  • 时间的隔离:中断处理
    • 随时打断正在执行的用户态App
  • 对破坏隔离的处理:异常处理
    • OS在内核态及时处理用户态App的异常行为

数据隔离:虚拟内存

  • 虚拟内存
    • 读写内存的安全性问题
    • 进程间的安全问题
    • 内存空间利用率的问题
    • 内存读写的效率问题
  • 地址空间 address spaces
    • 一个程序仅寻址其自己的内存
    • 若无许可,则每个程序无法访问不属于自己的内存

虚拟内存的工作原理

w:800


控制隔离:特权模式

  • CPU 硬件中的特权模式
    • 防止应用程序访问设备和敏感的 CPU 寄存器
      • 地址空间配置寄存器
      • 关机相关的指令或寄存器
      • ......

特权模式

  • CPU 硬件支持不同的特权模式
    • Kernel Mode(内核态) vs User Mode(用户态)
    • 内核态可以执行用户态无法执行的特权操作
      • 访问外设
      • 配置地址空间(虚拟内存)
      • 读/写特殊系统级寄存器
  • OS内核运行在内核态
  • 应用程序运行在用户态
  • 每个微处理器都有类似的用户/内核模式标志

时间隔离:中断/异常机制

  • CPU 硬件支持中断/异常的处理 -异常: 及时响应和处理应用的异常行为 -中断: 打断一直占用 CPU 的应用程序

  • 中断是异步发生,是来自处理器外部的 I/O 设备的信号的结果。

    • 异步是指,硬件中断不是由任何一条专门的 CPU 指令造成。

中断处理例程

  • 中断处理例程(interrupt handle):硬件中断/异常的处理程序
    1. I/O 设备通过向处理器芯片的一个引脚发信号,并将异常号放到系统总线上,以触发中断;
    2. 在当前指令执行完后,处理器从系统总线读取异常号,保存现场,切换到内核态
    3. 调用中断处理例程,当中断处理程序完成后,它将控制返回给下一条本来要执行的指令。

时钟中断

  • Timer 可以稳定定时地产生中断
    • 防止应用程序死占着 CPU 不放
    • 让OS内核能周期性地进行资源管理

中断处理例程

  • 触发中断

  • 保存现场,切换到内核态运行

  • 返回,恢复中断前下一条指令 bg right:62% 100%


异常处理例程

  • 根据异常编号去查询处理程序

  • 保存现场

  • 异常处理:杀死产生异常的程序;或者 重新执行异常指令

  • 恢复现场 bg right:52% 100%


系统调用处理例程

  • 查找系统调用程序

  • 用户态切换到内核态

  • 栈切换,上下文保存

  • 执行内核态

  • 返回用户态

bg right:52% 100%


中断 vs 异常 vs 系统调用

中断异常系统调用
发起者外设、定时器应用程序应用程序
响应方式异步同步同步、异步
触发机制被动触发内部异常、故障自愿请求
处理机制持续,用户透明杀死或重新执行等待和持续

进程切换 vs 函数切换

w:500 w:600


小结

  • 了解计算机硬件与操作系统的关系:接口/边界
  • 了解操作系统与应用程序的关系:接口/边界
  • 了解操作系统如何隔离与限制应用程序

【总结笔记】

从OS角度看计算机系统

OS与硬件的关系

操作系统(OS)作为计算机系统中的一个关键组成部分,扮演着硬件和应用程序之间的中介角色。OS的主要职责包括管理硬件资源和提供应用程序执行的环境。从计算机系统的架构来看,操作系统位于硬件和应用程序之间的抽象层次,通过对硬件的虚拟化和抽象,使得应用程序能够在抽象的、简化的环境中运行,而无需直接与复杂的硬件交互。

OS与应用程序的关系

操作系统为应用程序提供了一个执行的环境,其中包括执行所需的各种服务,如文件操作、进程管理、内存分配等。这些服务通常通过系统调用的形式提供给应用程序,形成了OS与应用程序之间的另一个重要接口。系统调用是应用程序向操作系统请求服务的一种方式,它是一种受控的入口点,使得操作系统能够在提供服务的同时,保持对系统资源的控制和管理,从而确保系统的安全性和稳定性。

隔离机制

操作系统需要在各个应用程序之间以及应用程序与操作系统之间建立有效的隔离,以确保一个应用程序的行为不会影响到其他应用程序的正常运行,同时也保护操作系统免受恶意软件的攻击。隔离机制包括对控制、数据、时间的隔离,以及通过异常处理来对破坏隔离的行为进行处理。这些隔离方法可以基于软件、硬件或网络实现,具体方式取决于隔离的需求和系统设计。

隔离要解决的问题

隔离机制旨在解决的核心问题是如何在允许必要的信息交换和资源共享的同时,防止程序间或程序与操作系统间的不当影响。这包括防止程序读写其他程序的内存、占用过多的CPU资源、更改系统配置等潜在的恶意行为。有效的隔离策略能够增强系统的安全性、稳定性和可靠性。

隔离方法

操作系统实现隔离的方法多种多样,包括:

  • 控制隔离:通过特权级机制实现,区分用户态和内核态,限制应用程序对特权操作的访问。
  • 数据隔离:通过虚拟内存机制实现,为每个进程提供独立的地址空间,防止进程间的数据访问冲突。
  • 时间隔离:通过中断和异常处理机制实现,确保操作系统能够及时响应外设事件和应用程序异常,以及通过时钟中断实现对CPU资源的公平分配。

隔离机制的设计和实现是操作系统安全性和稳定性的关键。通过在需要的时候实现应用程序和操作系统间的严格分离,操作系统能够为所有应用程序提供一个安全、稳定且高效的运行环境。


计算机系统抽象层次
1. Physics(物理): 这是基础层,涉及物理学原理,如量子力学和电磁学,它们是构造计算设备物理组件的基础。
2. Devices(设备): 在物理层之上是设备层,这里的设备指的是实际构成计算机的物理组件,例如晶体管、二极管和电容器等。
3. Circuits(电路): 设备层的上一层是电路层,这里设计将电子设备(例如晶体管)连接在一起形成电路,以实现特定的功能,如逻辑门电路。
4. Gates/Register-Transfer Level (RTL): 在电路层之上是门级/寄存器传输级别,这里涉及逻辑门(如与门、或门和非门)的设计,以及如何将这些门组合成更复杂的电路来执行寄存器之间的数据传输和操作。
5. Microarchitecture(微架构): 微架构层是在逻辑门和电路的基础上构建具体的处理器架构。它定义了处理器内部的数据路径、流水线结构、缓存和执行单元等。
6. Instruction Set Architecture (ISA): 指令集架构是硬件(微架构)和软件之间的接口。它定义了处理器可以识别和执行的指令集合,包括数据类型、寄存器、指令格式、寻址模式等。
7. Operating System/Virtual Machines(操作系统/虚拟机): 操作系统是管理计算机硬件资源和提供用户与应用程序接口的软件层。虚拟机为运行在物理硬件之上的软件提供了一个虚拟的平台。
8. Programming Language(编程语言): 编程语言层提供了开发者用来编写软件的高级语言,这些语言通常更接近人类语言和抽象概念,使得软件开发更加高效。
9. Algorithm(算法): 算法层指的是解决特定问题和执行任务的方法和流程。算法是在编程语言中实现的,但在概念上独立于具体的实现。
10. Application(应用程序): 最顶层是应用程序层,它指的是最终用户直接使用的软件,例如文本编辑器、游戏或者企业软件等。这些应用程序使用底层所有层级提供的功能来执行用户需要的任务。
总的来说,这些层次从物理硬件到用户界面提供了一种分层的方式来理解和构建复杂的计算系统。每个层级抽象了底层的复杂性,提供了建立在其上的下一个层级所需的接口和功能。