MIT6828 学习笔记 005 (lec 3)

MIT6828 学习笔记 005 (lec 3)

RayAlto OP

1. 目标

  • 运行多个程序
  • 实现隔离
  • 实现复用
  • 共享

2. 胡乱想的一种设计

  • 应用程序直接访问硬件( CPU 核心&寄存器、内存、磁盘等);操作系统可能会对一些资源进行抽象

缺点:

  • 不好实现复用:程序间断地让出 CPU 才能实现复用,但程序不让出 CPU 或死循环时,其他程序无法运行
  • 不好实现隔离:程序直接访问物理内存,没有手段保护其他程序甚至操作系统的内存

3. Unix 接口可以方便地实现这些目标

  • 提供进程(而不是直接使用 CPU 核心):操作系统透明地(进程无法感知)给进程分配 CPU (保存&恢复寄存器)、强制进程间断地让出 CPU (间断地重新分配 CPU )
  • 提供虚拟内存空间(而不是直接使用物理内存):每个进程都有“自己的”内存、操作系统对内存布局有主动权、操作系统可以强制隔离程序的内存、操作系统可以利用磁盘当作缓存
  • 提供文件系统(而不是直接使用磁盘块):程序可以通过目录和文件名访问、操作系统可以支持在不同进程/用户间共享文件
  • 提供 pipe (而不是直接共享物理内存):操作系统可以向一方提醒另一方的状态

4. 操作系统必须实现保护

应用程序不应该有能力破坏操作系统/突破隔离。保护手段:硬件支持,比如 user/kernel mode 、虚拟内存。

处理器提供两个 mode : kernel mode 可以执行特权指令,如设置内核/用户数据、重新编程定时器芯片; user mode 不可以执行特权指令。操作系统运行在 kernel mode ,应用程序运行在 user mode ( RISC-V 还有 M mode ,但不常用)

kernel mode 应该对应 supervisor mode , M mode 应该指的是 machine mode , user mode 还可以称作 application mode ,可以参考这个表格

LevelEncodingNameAbbreviation
000User/ApplicationU
101SupervisorS
210Reserved
311MachineM

处理器提供虚拟内存:硬件提供 page tables 来把虚拟地址转换成物理地址,操作系统给每个程序配置 page tables 实现隔离

5. 程序必须能与内核沟通

如果不能的话程序很可能因为操作系统的保护导致很多操作不可实现。解决方式:提供一个可控的指令实现切换 mode , RISC-V 下有 ecall 指令可以在预设的入口点进入 kernel mode ,流程大概是这样:

1
app -> printf() -> write() -> SYSTEM CALL -> sys_write -> ...

应用程序不应该能直接执行内核里的方法

6. 内核就是 Trusted Computing Base

Trusted Computing Base (TCB, 可信计算基) ,操作系统中确保操作系统安全的部分。内核需要保证“正确”

  • CVE (Common Vulnerablities and Exposures)

7. monolithic kernel / microkernel

Xv6, Linux 都是 monolithic kernel 。

  • 优点
    • 方便子系统间合作
  • 缺点
    • 子系统间的合作很复杂
    • 更有可能有 bug
    • 内部没有隔离

还有 microkernel

  • 优点
    • 更好的隔离
  • 缺点
    • 可能很难实现高性能

两种架构在现实世界中都被广泛应用

8. RISC-V 计算机

可以是一张很精简的开发板

UART (Universal Asynchronous Receiver-Transmitter) ,通用异步收发器

  • 四核 RISC-V 处理器
  • RAM (128 MB)
  • interrupts 支持 (PLIC, CLINT)
  • UART 支持,以支持 Xv6 读取键盘输入、向 console 输出
  • e1000 网卡支持(通过 PCIe )