1. 课程导论与预备知识
1.1 xv6 简介
xv6 是麻省理工学院(MIT)为操作系统课程 6.828 开发的教学用 Unix 第六版(V6)内核。它使用 ANSI C 重写,并在 x86 多核处理器上运行。随着 RISC-V 架构的兴起,MIT 已将 xv6 移植到 RISC-V 64 位(RV64)平台,成为当前操作系统教学的主流参考内核。
学习价值: xv6 代码量约 9000 行,结构清晰,覆盖了进程调度、虚拟内存、文件系统、中断处理等核心 OS 概念,是理解真实操作系统内核的最佳入门材料。
| 特性 | 描述 |
|---|---|
| 代码规模 | 约 9000 行 C 代码 + 少量汇编 |
| 架构支持 | RISC-V 64 (RV64G) |
| 进程模型 | 抢占式多任务,每个进程独立地址空间 |
| 系统调用 | 约 20 个 POSIX 风格系统调用 |
| 文件系统 | 简单日志文件系统 (log-structured) |
| 许可证 | MIT 开源许可证 |
1.2 RISC-V 架构概述
RISC-V 是一个基于精简指令集计算(RISC)原则的开源指令集架构(ISA)。它由加州大学伯克利分校设计,现由 RISC-V 国际基金会维护。本课程聚焦于 RV64GC(通用 + 压缩指令扩展)子集。
核心寄存器组(RV64):
- x0 (zero):硬连线为 0,写入无效
- x1 (ra):返回地址寄存器
- x2 (sp):栈指针
- x3 (gp):全局指针
- x4 (tp):线程指针
- x5–x7 (t0–t2):临时寄存器
- x8 (s0/fp):保存寄存器 / 帧指针
- x9 (s1):保存寄存器
- x10–x17 (a0–a7):函数参数 / 返回值
- x18–x27 (s2–s11):保存寄存器
- x28–x31 (t3–t6):临时寄存器
1.3 移植目标与 BSP 概念
移植目标: 将 xv6 内核从标准 QEMU virt 平台适配到指定 RISC-V 开发板(如 SiFive HiFive Unleashed、K210、StarFive VisionFive 等),使其能在真实硬件上启动并运行。
BSP(板级支持包): 介于硬件平台与操作系统内核之间的软件层,封装了特定板卡的初始化、时钟、中断控制器、UART、定时器等底层驱动。
| BSP 组件 | 功能描述 | 移植工作量 |
|---|---|---|
| 启动代码 (start.S) | 设置栈指针、清零 BSS、跳转到 main | 中 |
| 时钟驱动 (timer) | 配置 CLINT/PLIC 定时器中断 | 高 |
| UART 驱动 | 串口输入输出,用于 printf/console | 中 |
| 中断控制器 | PLIC 初始化与中断路由 | 高 |
| 设备树 (DTB) | 描述硬件拓扑,内核解析外设地址 | 低 |
| 内存布局 | 定义 DRAM 起始地址、大小、MMIO 区域 | 低 |
常见陷阱: 不同 RISC-V 开发板的 CLINT/PLIC 地址映射不同,且部分板卡使用 AIA(高级中断架构)而非传统 PLIC。移植时必须核对芯片手册中的 MMIO 基地址。
1.4 开发环境与工具链
本课程使用以下工具链进行 xv6 的 RISC-V 移植开发:
- RISC-V GNU 工具链:riscv64-unknown-elf-gcc / g++ / as / ld
- QEMU 模拟器:qemu-system-riscv64,用于早期调试
- OpenOCD + GDB:用于真实板卡的 JTAG 调试
- Makefile 构建系统:管理编译、链接、烧录流程
快速验证环境:
# 安装 RISC-V 工具链 (Ubuntu/Debian)
sudo apt-get install gcc-riscv64-linux-gnu
# 安装 QEMU
sudo apt-get install qemu-system-misc
# 克隆 xv6 源码
git clone https://github.com/mit-pdos/xv6-riscv.git
cd xv6-riscv
# 编译并运行
make qemu
1.5 课程路线图
本课程共 30 章,分为四个阶段:
- 基础准备(第 1–5 章):环境搭建、RISC-V 汇编基础、链接脚本与启动流程
- 核心移植(第 6–18 章):时钟中断、UART 驱动、PLIC 初始化、进程切换、系统调用适配
- 文件系统与块设备(第 19–24 章):SD 卡驱动、virtio 块设备、日志系统移植
- 板级验证与优化(第 25–30 章):真实板卡启动、性能调优、调试技巧、项目实战
建议: 每章结束后,在 QEMU 上验证代码正确性,再烧录到真实板卡。先模拟后实机,可大幅降低调试难度。