RVKernel Lab:从千行 OS 到抢占、IPC 与 SMP¶
运行在 QEMU virt / RV32 上的 C 与汇编教学内核。项目从 Seiya Nuta 的 Operating System in 1,000 Lines 实践起步,在基础内核上增加设备中断、用户态抢占、具名管道和多核同步。
基础与扩展¶
| 层次 | 实现内容 | 阅读入口 |
|---|---|---|
| 教程基础 | 启动、上下文切换、Sv32 页表、用户态、系统调用、shell 与简化文件系统 | Lab 01 |
| 设备中断 | PLIC 分发、UART RX 缓冲、VirtIO 完成中断与阻塞等待 | external_handle_irq、read_write_disk |
| 用户态抢占 | SBI TIME 10 ms tick、调度器与 sleep/wakeup | Lab 02 |
| IPC | 8 个具名管道、256 字节环形缓冲、阻塞读写与 EOF | Lab 03 |
| SMP | 1~4 hart、SBI HSM 启动、每核状态、PCB 锁与 IPI 唤醒 | Lab 04 |
基础代码与后续扩展以项目提交 6f2b063(16.文件系统)为分界。教程基础功能归属上游实践,项目增量和边界以项目 README为准。
学习路径¶
- 从实验概览开始,准备 QEMU 环境并运行内置源码。
- 按项目的 11 节教程学习启动、内存、进程、文件系统、Trap、设备中断、抢占、IPC 和 SMP。
- 对照实现讲解,追踪可信栈、等待唤醒和锁在上下文切换中的交接。
- 阅读验证记录,再修改代码并运行回归测试。
运行与自测¶
依赖 Clang/LLVM(含 LLD、llvm-objcopy)、QEMU RISC-V 和 Bash。项目当前实测环境为 macOS / Homebrew,其他环境需要核对工具链和 OpenSBI。
git clone https://github.com/YvainZhang/1000-lines-os-practice.git
cd 1000-lines-os-practice
bash run.sh # 默认 2 核
# 退出当前 QEMU 后再运行
NCPU=4 bash run.sh # 4 核
进入 shell 后输入 help、hello、irqstat、selftest。全部自测通过时输出 SELFTEST PASS。退出 QEMU 使用 Ctrl-a,再按 x。
自测日志保存在项目的 test-results/。构建共享根目录产物与磁盘镜像,应顺序执行。自测覆盖功能性行为,不等于性能基准或完整竞态证明。
实现限制¶
普通内核路径不可抢占,尚未在真实硬件上验证。10 ms tick 是调度节拍,最坏响应时间尚未测量。项目没有完整 POSIX、fork/exec、物理页完整回收、动态 TLB shootdown 或完整负载均衡;UART TX 仍采用短轮询,块设备只有一个在途请求;运行脚本会重建文件系统镜像,不能据此证明重启持久化或崩溃一致性。
相关实验¶
RVKernel 实验概览提供内置源码和四个实验入口;最新实现和验证范围请以项目仓库为准。