一个以安全为先的微内核操作系统,使用 Rust 编写,面向 x86_64 架构。
设计原则: 安全性 > 效率 > 速度
Zero-OS 是一个企业级微内核,灵感来自 Linux 的模块化设计,具有以下特性:
- 内存安全:完全使用 Rust 编写,配合硬件保护(NX、W^X)
- 进程隔离:每进程独立地址空间,支持 COW(写时复制)
- 抢占式调度:多级反馈队列,基于优先级选择
- 基于能力的 IPC:进程间通信的细粒度访问控制
- 安全加固:W^X 强制执行、恒等映射清理、CSPRNG(ChaCha20)
| 组件 | 状态 | 描述 |
|---|---|---|
| 启动和内存 | 完成 | UEFI 启动、COW、守护页、伙伴分配器 |
| 进程管理 | 完成 | 每进程地址空间、fork/exec/wait |
| 调度器 | 完成 | IRQ 安全的 MLFQ、抢占式调度 |
| IPC | 完成 | 管道、消息队列、futex、信号 |
| 安全 | Phase 6 | W^X、RNG、23 轮审计(全部修复) |
| VFS | 完成 | 基础 VFS,stdin/stdout,阻塞 I/O |
| 用户模式 (Ring 3) | 完成 | SYSCALL/SYSRET、50+ 系统调用、Shell |
| 网络 | 未开始 | - |
| SMP | 基础设施 | Per-CPU 数据、TLB shootdown 占位符 |
Zero-OS/
├── bootloader/ # UEFI 引导加载程序
│ └── src/main.rs # ELF 加载器、页表设置
├── kernel/ # 内核工作区
│ ├── arch/ # x86_64 架构代码
│ │ ├── interrupts.rs # IDT、异常处理、PIC
│ │ ├── context_switch.rs # 完整上下文保存/恢复
│ │ ├── syscall.rs # SYSCALL/SYSRET 入口(per-CPU)
│ │ └── gdt.rs # 用户-内核转换的 GDT/TSS
│ ├── mm/ # 内存管理
│ │ ├── memory.rs # 堆分配器、帧分配器
│ │ ├── buddy_allocator.rs # 物理页分配器
│ │ ├── page_table.rs # 页表管理器
│ │ └── tlb_shootdown.rs # TLB 失效(SMP 就绪)
│ ├── sched/ # 调度器
│ │ ├── scheduler.rs # 基础轮转调度
│ │ └── enhanced_scheduler.rs # 带优先级的 MLFQ
│ ├── ipc/ # 进程间通信
│ │ ├── ipc.rs # 基于能力的端点
│ │ ├── pipe.rs # 匿名管道
│ │ ├── futex.rs # 用户空间快速互斥锁
│ │ └── sync.rs # WaitQueue、KMutex、Semaphore
│ ├── drivers/ # 设备驱动
│ │ ├── vga_buffer.rs # VGA 文本模式 / GOP 帧缓冲
│ │ ├── serial.rs # UART 16550
│ │ └── keyboard.rs # PS/2 键盘(带等待队列)
│ ├── kernel_core/ # 核心内核
│ │ ├── process.rs # PCB、进程表
│ │ ├── fork.rs # 带 COW + TLB shootdown 的 Fork
│ │ ├── syscall.rs # 50+ 系统调用
│ │ ├── signal.rs # POSIX 信号
│ │ └── elf_loader.rs # ELF 二进制加载
│ ├── security/ # 安全加固
│ │ ├── wxorx.rs # W^X 策略验证
│ │ ├── memory_hardening.rs # 恒等映射清理、NX
│ │ └── rng.rs # RDRAND/RDSEED、ChaCha20 CSPRNG
│ ├── cpu_local/ # Per-CPU 数据结构
│ ├── src/main.rs # 内核入口点
│ └── kernel.ld # 链接脚本
├── userspace/ # 用户空间程序
│ └── src/
│ ├── shell.rs # 交互式 Shell
│ └── syscall.rs # 系统调用封装
└── Makefile # 构建系统
- UEFI 引导加载程序从 ESP 加载
kernel.elf - 设置 4 级分页,使用 2MB 大页:
- 恒等映射前 4GB 用于硬件访问
- 高半区内核映射到
0xFFFFFFFF80000000
- 内核入口点在
0xFFFFFFFF80100000
- 伙伴分配器:物理页分配与合并
- LockedHeap:线程安全的内核堆
- COW(写时复制):高效的 fork,共享页面
- 守护页:栈溢出保护
- 页面清零:防止信息泄露
- PCB:进程控制块,176 字节上下文
- 每进程地址空间:上下文切换时切换 CR3
- Fork:完整的 COW 实现,带引用计数
- Exec:ELF 加载器,支持参数传递
- Wait/Exit:父子进程同步,僵尸进程清理
- 多级反馈队列:基于优先级选择
- 时间片:自动优先级调整
- IRQ 安全:所有操作使用
without_interrupts包装 - NEED_RESCHED:中断上下文中的延迟调度
- 消息队列:基于能力的端点访问
- 管道:带阻塞 I/O 的匿名管道
- Futex:用户空间快速互斥锁
- 信号:类 POSIX 信号处理(SIGKILL、SIGSTOP、SIGCONT 等)
- W^X 强制执行:验证没有页面同时可写和可执行
- 恒等映射加固:启动后移除可写标志
- NX 强制执行:数据页设置不可执行位
- CSPRNG:基于 ChaCha20 的 RNG,由 RDRAND/RDSEED 提供种子
- TLB Shootdown:跨 CPU TLB 失效基础设施(SMP 就绪)
- Per-CPU 数据:每 CPU 独立的系统调用临时栈
- SYSCALL/SYSRET:通过 MSR 配置的快速系统调用入口
- 50+ 系统调用:fork、exec、read、write、mmap、munmap 等
- 用户-内核隔离:独立地址空间,SMAP 就绪的安全检查
- 交互式 Shell:带阻塞 I/O 的命令行界面
- FPU/SIMD 支持:FXSAVE64/FXRSTOR64 状态保存
- Rust nightly,带
rust-src和llvm-tools-preview - 带 OVMF 的 QEMU(UEFI 启动)
- GNU Make
# 构建所有组件
make build
# 构建并在 QEMU 中运行(图形界面)
make run
# 串口输出到终端
make run-serial
# 使用 GDB 调试(连接到 :1234)
make debug
# 清理构建产物
make clean在 QEMU 中启用 RDRAND/RDSEED 支持:
qemu-system-x86_64 -cpu host -enable-kvm ...
# 或使用支持 RDRAND 的 CPU 型号:
qemu-system-x86_64 -cpu Haswell ...项目已经过 23 轮安全审计:
| 指标 | 数值 |
|---|---|
| 发现的问题总数 | 82+ |
| 已修复问题 | 100% |
| 最新审计 | 第 23 轮 (2025-12-19) |
- R23-1:COW TLB shootdown 基础设施(SMP 就绪)
- R23-2:Per-CPU 系统调用临时栈
- R23-3:两阶段 munmap 与 TLB 失效
- R23-4/R23-5:阻塞式 stdin 实现
- UEFI 启动与 ELF 加载
- 内存管理(堆、伙伴分配器、COW)
- 进程管理(fork、exec、wait、exit)
- 抢占式调度器(MLFQ)
- IPC(管道、消息队列、futex、信号)
- 安全加固(W^X、NX、CSPRNG)
- 用户模式(Ring 3)与 SYSCALL/SYSRET
- VFS 与阻塞式 stdin/stdout
- 23 轮安全审计全部完成
- SMP 基础(per-CPU 数据、TLB shootdown 基础设施)
- 基于 IPI 的 TLB 失效
- 能力框架
- MAC/LSM 安全钩子
- 带防火墙的网络栈
- 完整 SMP(多核调度)
- 容器/命名空间隔离
完整的企业安全路线图请参见 roadmap-enterprise.md。
- 所有更改需要代码审查
- 提交前运行
make build - 新功能需要更新文档
- Bug 修复应包含回归测试
本项目用于教育和研究目的。