跳至正文
这篇笔记的目录
回到学习目录
技术开发

xv6 源码分析

xv6 是一套精简的类 Unix 教学操作系统;阅读它的关键,是沿着“用户态请求 → 内核子系统 → 返回用户态”追踪一条具体路径。

#RISC-V#xv6#计算机系统#学习笔记

一句话: xv6 是一套精简的类 Unix 教学操作系统;阅读它的关键,是沿着“用户态请求 → 内核子系统 → 返回用户态”追踪一条具体路径。

本章导航#

xv6 是什么 · 目录地图 · 系统结构 · 如何读代码

学习目标#

  • 认识 xv6 RISC-V 版本的主要子系统和源码位置。
  • 了解 U/S/M 特权级与用户/内核边界。
  • 使用 QEMU、GDB 和教材从可观察的路径入手读源码。

1. xv6 是什么#

xv6 是 MIT 教学用的类 Unix 操作系统,受 Unix Version 6 启发,并在 RISC-V 多核机器模型上实现。它小而完整,适合学习系统调用、页表、进程、驱动、锁和文件系统;它不是以生产环境功能与硬化为目标的通用发行版

本文以 MIT 的 xv6 RISC-V 教材源码仓库为参照。课程分支会增加实验代码或改变细节;阅读时把教材、提交版本和本地源码对应起来。

2. 先认目录和关键文件#

文件/目录主要职责
kernel/entry.Skernel/start.c每个 hart 的早期入口和机器态到 supervisor 态的准备
kernel/main.c内核主要初始化编排
kernel/proc.ckernel/swtch.S进程状态、调度和上下文切换
kernel/vm.c内核映射、用户页表和地址空间操作
kernel/trampoline.Skernel/trap.c用户/内核 trap 入口、保存状态和返回路径
kernel/syscall.ckernel/sysproc.ckernel/sysfile.c系统调用分派及具体实现
kernel/fs.ckernel/log.ckernel/bio.cinode、块映射、日志和 buffer cache
user/用户程序、启动代码和系统调用 stub
Makefile目标工具链、构建规则、QEMU/GDB 目标

3. 内核如何组织#

可以把执行路径分成四层:

用户程序(user/)
│ 系统调用指令与 ABI
trap / syscall 入口(trampoline.S、trap.c、syscall.c)
│ 选择服务并检查/转换参数
子系统(proc、vm、fs、device driver)
│ 操作内核数据结构、内存与设备
RISC-V 硬件接口(CSR、页表、特权级、MMIO)

RISC-V 特权架构定义 M(Machine)、S(Supervisor)、U(User)等权限级;具体实现可以支持不同组合。xv6 的内核主要在 S-mode 执行,用户程序在 U-mode 执行;启动阶段会借助 M-mode 固件/代码完成移交。特权级切换不等于“换了 CPU”,而是改变执行权限和相关架构状态。

4. 建议的源码阅读方法#

  1. 固定版本:记录仓库分支或 commit,并查看仓库 README / Makefile
  2. 选一个入口:例如用户程序的 writeforkexec
  3. 沿函数和汇编边界追踪:谁设置寄存器、在哪里触发 trap、内核如何取参数、结果如何返回。
  4. 观察状态:用 QEMU/GDB 在关键函数设断点,查看寄存器、页表、进程状态或磁盘块。
  5. 用教材解释设计,再以当前源代码核对实现细节。

推荐顺序:系统调用接口 → trap/页表 → 进程调度 → 文件系统 → 驱动与并发。每读一个概念,挑一条端到端路径验证,而不是先背完整目录。

核心结论: xv6 是把操作系统概念落到真实代码上的教学样本;理解路径和不变量,比记文件名更有用。

下一篇: 08 · xv6 启动流程深入分析09 · xv6 进程管理