2. RISC-V架构基础

做嵌入式开发,尤其是 RISC-V 这种还比较新的架构,宿主机环境搞不定,后面全是坑。我见过太多人花了一整天装 QEMU,结果卡在依赖冲突上,最后发现是系统包管理器版本太老。

这一章,咱们就把三种主流宿主机环境捋一遍。你选一种就行,不用全装。

核心原则:无论你用哪个系统,最终目标都是得到一个能运行 qemu-system-riscv64 的终端环境,并且能正常编译 RISC-V 交叉工具链。

Linux 系统安装与配置

Linux 是我个人最推荐的主开发环境。原因很简单——RISC-V 生态里的工具链、模拟器,原生 Linux 支持最好,踩坑最少。

我建议你用 Ubuntu 22.04 LTS 或 Debian 12。这两个发行版的包管理成熟,社区活跃,遇到问题搜一下就有答案。

基础依赖安装

打开终端,先更新包索引:

sudo apt update
sudo apt upgrade -y

然后安装编译工具和 QEMU 依赖:

sudo apt install -y \
    build-essential \
    git \
    vim \
    curl \
    wget \
    python3 \
    python3-pip \
    ninja-build \
    pkg-config \
    libglib2.0-dev \
    libpixman-1-dev \
    libslirp-dev \
    libfdt-dev \
    zlib1g-dev \
    libssl-dev

这里有个坑——libslirp-dev 在 Ubuntu 20.04 里可能没有。如果你用的是老版本,可以换成 libslirp0 或者直接跳过,QEMU 编译时关掉 slirp 支持就行。我曾经在客户服务器上遇到这个问题,折腾了半小时才发现是源的问题。

验证环境

装完后,检查一下关键工具的版本:

gcc --version
python3 --version
git --version

确保 gcc 版本不低于 10,python3 不低于 3.8。太低的话,后面编译 QEMU 会报错。

小技巧:如果你在虚拟机里跑 Linux,记得给虚拟机分配至少 4GB 内存和 2 个 CPU 核心。编译 QEMU 和工具链时,多核能省不少时间。

Windows 下 WSL2 环境搭建

Windows 用户怎么办?别用 Cygwin 或 MSYS2 硬扛。WSL2 才是正道。

WSL2 本质上是一个轻量级虚拟机,跑的是真正的 Linux 内核。你在里面装的 QEMU,跟原生 Linux 上跑的完全一样。

启用 WSL2

以管理员身份打开 PowerShell,执行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重启电脑后,下载并安装 WSL2 内核更新包:

# 访问微软官方页面下载 wsl_update_x64.msi
# 或者用命令行:
wsl --set-default-version 2

安装 Ubuntu 发行版

打开 Microsoft Store,搜索 "Ubuntu 22.04",点击安装。装完后启动,设置用户名和密码。

然后更新包管理器:

sudo apt update && sudo apt upgrade -y

接下来,安装跟 Linux 环境一模一样的依赖包。把上面那串 apt install 命令复制过来执行就行。

注意:WSL2 默认不会把 Windows 的 PATH 环境变量传给 Linux 子系统。如果你需要在 WSL2 里调用 Windows 下的工具(比如 VS Code),可以在 /etc/wsl.conf 里加上 [interop] appendWindowsPath = true。

文件互访

WSL2 的 Linux 文件系统在 \\wsl$\Ubuntu\ 路径下。Windows 的 C:\ 盘挂载在 /mnt/c/。我习惯把项目代码放在 Linux 文件系统里,避免跨文件系统操作带来的性能损失。

macOS 下的 Homebrew 与依赖安装

macOS 用户,尤其是用 Apple Silicon(M1/M2)芯片的,需要注意一点——QEMU 对 ARM 架构的 macOS 支持已经非常好了,但有些 RISC-V 工具链可能还是 x86_64 的二进制,需要 Rosetta 2 转译。

安装 Homebrew

如果你还没装 Homebrew,打开终端:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

装完后,把 brew 加入 PATH:

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

安装 QEMU 及依赖

brew install qemu
brew install ninja
brew install pkg-config
brew install glib
brew install pixman
brew install libslirp

macOS 下不需要单独装 libfdt,QEMU 自带了。另外,build-essential 对应的是 Xcode Command Line Tools:

xcode-select --install

验证安装

qemu-system-riscv64 --version

如果看到版本号输出,说明 QEMU 装好了。我遇到过一个问题——Homebrew 安装的 QEMU 版本可能比较新,跟某些老旧的 RISC-V 固件不兼容。这时候可以指定安装旧版本:

brew install qemu@7

避坑指南:macOS 下编译 RISC-V 工具链时,如果遇到 sys/endian.h 找不到的错误,是因为 macOS 没有这个头文件。解决办法是安装 brew install coreutils,然后设置 export CPPFLAGS="-I/opt/homebrew/include"。

三种环境对比

环境 优点 缺点 推荐指数
Linux 原生 兼容性最好,工具链齐全 需要双系统或虚拟机 ⭐⭐⭐⭐⭐
Windows + WSL2 无需离开 Windows,性能接近原生 文件系统跨访较慢 ⭐⭐⭐⭐
macOS + Homebrew 安装简单,Apple Silicon 支持好 部分工具链需 Rosetta 转译 ⭐⭐⭐⭐

知识结构图

下面这张图帮你理清宿主机环境准备的整体脉络:

宿主机环境准备知识结构图 宿主机环境准备 Linux 原生 Windows + WSL2 macOS + Homebrew Ubuntu 22.04 / Debian 12 apt 安装依赖包 启用 WSL2 + 安装 Ubuntu apt 安装相同依赖 Homebrew 安装 QEMU Xcode Command Line Tools qemu-system-riscv64 可运行 + 可编译工具链 三种环境最终目标一致:能运行 qemu-system-riscv64 并编译 RISC-V 交叉工具链

环境验证清单

不管你用哪种环境,装完后跑一遍这个清单,确保没有遗漏:

  1. QEMU 可用:qemu-system-riscv64 --version 输出正常
  2. 编译器可用:gcc --version 或 clang --version 输出正常
  3. Python 可用:python3 --version 不低于 3.8
  4. Git 可用:git --version 输出正常
  5. Ninja 可用:ninja --version 输出正常
  6. pkg-config 可用:pkg-config --version 输出正常

常见问题:如果你在 WSL2 或 macOS 下遇到 ERROR: glib-2.56 gthread-2.0 is required to compile QEMU,说明 glib 版本太旧。在 WSL2 里升级 Ubuntu 到 22.04,在 macOS 里用 brew upgrade glib 解决。

环境准备好了,接下来就可以动手编译 QEMU 和 RISC-V 工具链了。嗯,这部分才是真正的重头戏。