设计理念
OpenOS 的设计遵循一系列明确的原则,这些原则指导了架构决策和实现选择。
核心设计原则
Section titled “核心设计原则”1. 安全第一
Section titled “1. 安全第一”原则: 内存安全是不可妥协的要求。
实现:
- 使用 Rust 语言,编译期内存安全
- 借用检查器消除 use-after-free、double-free
unsafe边界明确标记硬件交互点
权衡:
- 学习曲线较陡
- 某些硬件交互需要
unsafe - 生态系统成熟度低于 C
2. 最小化内核
Section titled “2. 最小化内核”原则: 内核只做最必要的事情。
实现:
- 微内核架构
- 仅核心服务在内核空间:内存管理、调度、IPC
- 驱动和大部分服务运行在用户空间
权衡:
- IPC 开销较高
- 更复杂的启动序列
- 性能调优更困难
3. 明确优于隐式
Section titled “3. 明确优于隐式”原则: 所有重要的事情都应该是显式的。
实现:
- 无全局状态(无全局 FD 表,无 errno)
- 显式权限(Handle + Rights)
- 显式资源管理(所有权系统)
权衡:
- 代码更冗长
- 需要更多样板代码
- 但更易于理解和调试
4. 故障隔离
Section titled “4. 故障隔离”原则: 一个组件的故障不应影响其他组件。
实现:
- 用户空间驱动隔离
- 独立的地址空间
- 进程间 IPC 通信
权衡:
- IPC 开销
- 更复杂的错误处理
- 但系统更健壮
5. 可组合性
Section titled “5. 可组合性”原则: 系统应该由可组合的构建块组成。
实现:
- 基于端口的 IPC
- 消息传递模式
- 服务可以独立替换
权衡:
- 需要定义清晰的接口
- 版本兼容性挑战
- 但系统更灵活
设计理念对比
Section titled “设计理念对比”vs Linux(宏内核)
Section titled “vs Linux(宏内核)”| 方面 | OpenOS | Linux |
|---|---|---|
| 内核大小 | 小 (~100 KiB) | 大 (~10 MiB) |
| 驱动位置 | 用户空间 | 内核空间 |
| 故障隔离 | 强 | 弱 |
| IPC 开销 | 高 | 低 |
| 可验证性 | 高 | 低 |
| 性能 | 中等 | 高 |
vs seL4(形式化验证微内核)
Section titled “vs seL4(形式化验证微内核)”| 方面 | OpenOS | seL4 |
|---|---|---|
| 形式化验证 | 否 | 是 |
| 实现语言 | Rust | C |
| 内存安全 | 编译期保证 | 形式化证明 |
| 成熟度 | 研究项目 | 生产就绪 |
| 许可 | MIT/Apache-2.0 | GPL |
vs Zircon(Fuchsia)
Section titled “vs Zircon(Fuchsia)”| 方面 | OpenOS | Zircon |
|---|---|---|
| 目标平台 | x86_64 裸机 | 多平台 |
| IPC 模型 | 基于端口 | Channel + Handle |
| 进程模型 | 简单 | 复杂(Job, Process, Thread) |
| 文件系统 | VFS 占位符 | 完整实现 |
| 成熟度 | 研究项目 | 生产就绪 |
设计决策记录
Section titled “设计决策记录”详细的设计决策请参考 架构决策记录。
关键决策:
OpenOS 的设计受到以下项目的影响:
- 最小系统调用数量
- 能力(Capability)作为唯一的访问控制
- 形式化验证的启发
Zircon(Fuchsia)
Section titled “Zircon(Fuchsia)”- Handle 与 Rights
- Channel 与 Handle 传递
- VMO/VMAR 概念
- 同步消息传递
- Pulse 用于异步通知
- 微内核架构
Plan 9
Section titled “Plan 9”- 每进程命名空间
- 资源管理器作为用户空间服务器
- 一切皆文件的理念
- 完善 IPC - 实现完整的端口消息传递
- 用户态进程 - ELF 加载和 Ring 3 切换
- 基本驱动 - 键盘、磁盘驱动
- 文件系统 - VFS 和基本文件系统
- 网络栈 - TCP/IP 实现
- 显示服务器 - 基本图形支持
- 形式化验证 - 关键组件的正确性证明
- 多核支持 - SMP 调度
- 安全增强 - 能力系统、内存保护