这是一个仿照 rustlings 风格的 Rust 进阶与操作系统入门练习仓库。
你将通过补全代码并通过测试,学习 Rust 并发编程、异步编程、no_std 开发,以及操作系统核心概念。
- Rust 工具链(stable,>= 1.75)
- Linux 环境:大多数练习面向 x86_64;模块 4(上下文切换)仅支持 riscv64,需要 riscv64 环境或 QEMU 用户态模拟
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh总共 6 个模块,23 道练习,难度由浅入深:
| # | 练习 | 涉及概念 |
|---|---|---|
| 1 | 01_thread_spawn |
thread::spawn、move 闭包、join |
| 2 | 02_mutex_counter |
Arc<Mutex<T>>、共享状态并发 |
| 3 | 03_channel |
mpsc::channel、多生产者模式 |
| 4 | 04_process_pipe |
Command、Stdio::piped()、进程管道 |
| # | 练习 | 涉及概念 |
|---|---|---|
| 1 | 01_mem_primitives |
no_std 内存原语:memcpy、memset、memmove、strlen、strcmp |
| 2 | 02_bump_allocator |
GlobalAlloc trait、Bump 分配器、基于 CAS 的线程安全 |
| 3 | 03_free_list_allocator |
空闲链表分配器、侵入式链表、首次适配策略 |
| 4 | 04_syscall_wrapper |
跨架构 syscall ABI(x86_64/aarch64/riscv64)、内联汇编 |
| 5 | 05_fd_table |
文件描述符表、Arc<dyn File>、fd 复用策略 |
| # | 练习 | 涉及概念 |
|---|---|---|
| 1 | 01_atomic_counter |
AtomicU64、fetch_add、CAS 循环 |
| 2 | 02_atomic_ordering |
内存序、Release-Acquire、OnceCell |
| 3 | 03_spinlock |
自旋锁实现、compare_exchange、spin_loop |
| 4 | 04_spinlock_guard |
RAII guard、Deref / DerefMut / Drop |
| 5 | 05_rwlock |
从零实现写者优先读写锁(不使用 std::sync::RwLock) |
| # | 练习 | 涉及概念 |
|---|---|---|
| 1 | 01_stack_coroutine |
被调用者保存寄存器、栈帧、上下文切换 |
| 2 | 02_green_threads |
绿色线程调度器、协作式调度、yield |
模块 4 仅能在 riscv64 上运行。和仓库中的其他部分一样,直接运行 ./check.sh 或使用 oscamp CLI 即可,不需要额外脚本。详情见 exercises/04_context_switch/README.md。
| # | 练习 | 涉及概念 |
|---|---|---|
| 1 | 01_basic_future |
手动实现 Future trait、Poll、Waker |
| 2 | 02_tokio_tasks |
tokio::spawn、JoinHandle、并发任务 |
| 3 | 03_async_channel |
tokio::sync::mpsc、异步生产者-消费者 |
| 4 | 04_select_timeout |
tokio::select!、超时控制、竞态执行 |
| # | 练习 | 涉及概念 |
|---|---|---|
| 1 | 01_pte_flags |
SV39 PTE 位布局、通过位操作构造/解析页表项 |
| 2 | 02_page_table_walk |
单级页表、VPN/offset 拆分、地址翻译、缺页异常 |
| 3 | 03_multi_level_pt |
SV39 三级页表、页表遍历、大页(2MB)映射 |
| 4 | 04_tlb_sim |
TLB 查找/插入/FIFO 替换、刷新(全部/按页/按 ASID)、MMU 模拟 |
# 1. 克隆仓库
git clone <repo-url> && cd oscamp-base-experiment
# 2. 构建交互式 CLI 工具
cargo build -p oscamp-cli
# 3. 启动交互式练习模式(推荐)
./target/debug/oscamp watch仓库内置了一个类似 rustlings 的交互式终端工具,支持实时文件监听和进度跟踪:
oscamp # 启动交互式监听模式(默认)
oscamp watch # 同上
oscamp list # 查看所有练习的完成状态
oscamp check # 批量检查所有练习
oscamp run <pkg> # 运行指定练习的测试
oscamp hint <pkg> # 查看练习提示
oscamp help # 显示帮助- 自动检测文件变更:保存文件后自动重新运行测试
- 自动跳转:当前练习通过后,自动跳到下一个未完成练习
- 实时进度条:显示整体完成进度
- 快捷键:
h:查看当前练习提示l:查看全部练习列表n/p:下一个 / 上一个练习r/Enter:重新运行测试q/Esc:退出
# 运行某个练习的测试
cargo test -p thread_spawn
# 查看详细输出
cargo test -p thread_spawn -- --nocapture
# 检查全部练习
cargo test --workspace- 开始:运行
./target/debug/oscamp watch进入交互模式 - 阅读:打开当前练习文件
src/lib.rs,阅读文档理解相关概念 - 编码:找到
todo!()标记,根据注释提示补全代码 - 保存:保存文件后,CLI 会自动重新运行测试
- 通过:测试通过后会自动跳转到下一题;你也可以随时按
h查看提示
将代码推送到你仓库的 main 分支后,会触发评分流水线。GitHub Actions 会自动运行全部测试、计算你的得分(满分 100),并上传到 OpenCamp 排行榜。
- 接受 GitHub Classroom 作业链接,这会创建你的个人仓库
- 在本地或 GitHub Codespaces 中完成练习(点击 "Code" > "Codespaces" > "Create")
- 提交并推送你的修改到
main - 在 "Actions" 页面查看分数
- 部分练习(例如模块 2 的 syscall wrapper、模块 4 的汇编相关内容)需要 Linux 环境;模块 4 仅支持 riscv64
- 建议按照模块顺序完成练习;每个模块内部的题目也按照由浅入深排列
MIT