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):临时寄存器
RISC-V 特权架构分层 应用层 (U-Mode) 用户程序、应用程序、运行时库 操作系统层 (S-Mode) xv6 内核、进程调度、虚拟内存、文件系统 机器层 (M-Mode) Boot ROM、机器模式异常处理、物理内存保护 特权级切换机制 ecall 指令从 U→S→M;mret/sret 从 M/S 返回

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 基地址。
xv6 移植 BSP 软件架构 xv6 内核 (通用代码) 板级支持包 (BSP) 启动代码 | 时钟 | UART | 中断控制器 | 设备树 RISC-V 硬件平台 (SoC + 外设) BSP 隔离硬件差异,使 xv6 内核无需修改即可运行在不同板卡上

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. 基础准备(第 1–5 章):环境搭建、RISC-V 汇编基础、链接脚本与启动流程
  2. 核心移植(第 6–18 章):时钟中断、UART 驱动、PLIC 初始化、进程切换、系统调用适配
  3. 文件系统与块设备(第 19–24 章):SD 卡驱动、virtio 块设备、日志系统移植
  4. 板级验证与优化(第 25–30 章):真实板卡启动、性能调优、调试技巧、项目实战
建议: 每章结束后,在 QEMU 上验证代码正确性,再烧录到真实板卡。先模拟后实机,可大幅降低调试难度。