目标与背景
操作系统课本里的进程调度、页表映射、系统调用和文件系统概念往往比较抽象,只看书很容易停留在表面。这个项目用来记录我跟学 MIT 6.1810(Operating System Engineering)课程的过程——基于教学系统 RISC-V xv6 阅读内核源码、完成配套实验,把抽象机制一步步对应到真实的 C 与汇编代码上。
我的工作
我在自己的 Mac(Apple Silicon)上独立搭起了完整的交叉编译与调试环境,基于课程官方仓库推进实验开发,并把每次做实验时踩到的坑、源码走读和 GDB 调试过程整理成博客笔记。
开发环境包含 RISC-V GNU 交叉工具链、QEMU 虚拟机、交叉版 GDB 以及 Neovim 的 clangd / nvim-dap 插件配置,基础搭建步骤记录在 macOS 下环境准备与 xv6 源码运行 中。
已完成的实验内容
目前已经完成了 Lab Utilities 阶段的几个用户态程序练习:
sleep:解析命令行参数并调用sleep系统调用让进程休眠,熟悉用户态程序如何跨越边界进入内核。memdump:按给定的格式控制串解析内存缓冲区中的整数、指针、字符与字符串,练熟 C 语言里的指针步进、强制类型转换与内存字节布局。find:打开目录文件并循环读取dirent目录项,跳过.与..递归遍历子目录,打印匹配目标文件名的路径,把open、fstat、read和文件系统目录结构串起来。
方案与取舍
日常运行和排错主要靠 QEMU 配合 GDB 远程调试。刚开始追踪内核启动或单个系统调用路径时,我会使用 CPUS=1 单核参数启动虚拟机,先排除多核并发中断的干扰把主干流程看明白;调试具体用户程序时再手动补载对应二进制的符号表,让编辑器的断点能准确停在用户态代码上。
写学习笔记时,我也尽量不照抄实验指导书,而是顺着“程序入口 → 系统调用陷入 → 内核数据结构变化”的顺序去记,顺手把调试时观察到的真实寄存器和内存状态留作参考。
当前进度与下一步计划
现阶段已经跑通了整套编译调试工作流和基础工具实验;回看前几个小程序的代码,也暴露出了一些 C 语言系统编程细节(比如固定长度目录项的字符串结尾处理、递归路径缓冲区长度检查以及错误分支的 fd 回收),后续会一边补齐边界处理,一边继续往系统调用、页表(Page Tables)和陷阱机制(Traps)等核心内核实验推进。
