Proto: A Guided Journey through Modern OS Construction
先简单讲一下我为什么会关注这篇文章,因为大部分计算机本科生都会上一门操作系统/CSAPP的课,在这门课上都会写一个操作系统的程序,而我看到这篇文章很惊讶于为什么这个文章能发表在SOSP上,以及什么叫做modern OS construction,它和过去我们的作业究竟有什么区别,以及对我们能带来什么启发,下面的笔记由AI参与辅助生成。
一、论文背景与研究动机
传统教学型操作系统(如 xv6、Pintos、Nachos)主要面向概念教学,通常是"无头(headless)"系统,只支持 shell、简单文件系统和有限的用户程序。这类系统在传授 OS 核心抽象方面非常成功,但存在明显局限:
- 应用简单,缺乏交互性与吸引力
- 多运行在模拟器中,难以体现真实硬件问题
- 与现代操作系统在结构和使用方式上差距较大
Proto 的目标并不是替代这些系统,而是回答一个不同的问题:
能否在可控复杂度内,让学生完整构建一个
可运行、可展示、可玩、且贴近现代操作系统的问题空间的 OS?
二、核心设计理念(Principles)
论文提出并贯彻了四条设计原则(P1--P4):
P1:以"有吸引力的应用"驱动 OS 机制
- 应用包括 3D 动画、游戏(Mario、DOOM)、音乐播放器、视频播放器等
- OS 机制的引入必须直接服务于应用需求
- 没有 cache flush → 屏幕渲染错误
- 没有线程 → 音频播放中断
P2:可演示性(Demonstrability)
- OS 必须运行在真实硬件(Raspberry Pi 3, ARMv8)
- 系统可携带、可展示,具有长期可用性
P3:渐进式原型(Incremental Prototyping)
- 完整 Proto 被拆分为 5 个可运行原型
- 每个原型都是一个功能闭环系统
- 避免"一次性实现"的复杂度爆炸
P4:最小可行实现(Minimum Viable OS)
- 每一项 OS 功能必须有明确用途
- 拒绝"为了完整而完整"的机制设计
三、Proto 的整体架构概览
1. 执行模型
- 单体内核(monolithic kernel)
- ARMv8:
- EL1:内核
- EL0:用户程序
- 支持:
- 用户进程
- 用户线程 / 内核线程
- 多核并行执行(4 核 Cortex-A53)
2. 内存管理
- 每个应用独立地址空间
- 用户空间:0x0 起始
- 内核空间:0xffff... 前缀
- 页粒度:
- 内核:1MB block mapping
- 用户:4KB pages
- 支持 page fault 与 demand paging(用户栈)
3. 系统调用
- 共 28 个 syscall,分三类:
- 任务管理(fork, exec, sleep)
- 文件系统(open, read, write)
- 线程与同步(clone, semaphore)
四、Proto 为什么是"现代操作系统"
1. 真实的用户态 / 内核态分离
- ELF 装载、exec 路径完整
- page fault、非法访问真实触发异常
- 用户态承载复杂应用(SDL、DOOM)
→ 用户态不是"教学示意层",而是第一等执行环境
2. 现代并发模型:线程优先
- 实现 clone(CLONE_VM),语义对齐 Linux
- 线程共享 mm_struct
- 支持:
- semaphore syscall
- 用户态 mutex / condvar / spinlock
- 音频解码与播放真正并行
→ 从"进程并发"过渡到"线程并发"
3. 现代 I/O 设计
- USB 键盘(中断驱动)
- DMA 音频输出
- ring buffer + 非阻塞 I/O
- 设备文件(/dev/fb, /dev/events, /dev/surface)
→ I/O 是异步、并发、事件驱动的
4. 面向真实存储生态
- 双文件系统设计:
- ramdisk(系统)
- FAT32(用户数据)
- 可与 PC / 手机直接交换文件
- 视频、音乐、游戏资源为真实资产
→ 文件系统服务真实使用场景,而非课堂样例
5. 多核与 SMP 支持
- 启动并管理多个 CPU 核心
- 每核独立 runqueue 与异常向量
- cache coherence 配置
- 多实例 Mario、区块链矿工接近线性扩展
→ 进入真实多核 OS 问题域
6. 图形系统是一等公民
- framebuffer 为核心外设
- 内核态窗口管理器(~800 SLoC)
- 支持:
- 多窗口
- z-order
- dirty region
- 半透明窗口
- 输入焦点管理
→ OS 是交互平台,而非"黑箱内核"
7. 直面真实硬件复杂性
- cache flush 才能正确渲染
- 多核非确定性 bug
- USB 枚举与中断问题
- 提供:
- 自宿主调试器
- trace buffer
- panic button(FIQ)
→ 学习真实系统工程,而非理想模型
五、渐进式原型设计(Prototype 1--5)
| 原型 | 新增能力 | 代表应用 |
|---|---|---|
| P1 | framebuffer / UART | donut |
| P2 | 多任务 | 多 donut |
| P3 | VM + 用户态 | Mario |
| P4 | 文件系统 + USB + DMA | MusicPlayer |
| P5 | 多核 + 线程 + WM | DOOM / Desktop |
每个原型都:
- 可独立运行
- 有明确应用目标
- 为下一个原型提供稳定基线
六、论文的主要贡献
- 提出应用驱动、可展示的教学 OS 设计范式
- 实现一个真实、现代、可控复杂度的操作系统
- 展示现代 OS 机制的"最小可行实现"方式
- 通过性能、能耗、扩展性与用户研究完成实证闭环
- 提供可复用、可扩展的开源系统平台
七、为什么可以发表在 SOSP
- 提出清晰的 OS 设计原则(不是课程总结)
- 覆盖现代 OS 的关键问题空间
- 真实系统 + 真实硬件 + 真实评估
- 对"教学 OS 如何进入系统研究领域"给出完整答案
八、个人总结
Proto 不是在"简化操作系统",
而是在约束复杂度的前提下,尽可能逼近现代操作系统的真实形态。
它展示了一种可能性:
一个操作系统,既可以是研究系统,
也可以是教学系统,
同时还是一个真正可用的系统。