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 转译 | ⭐⭐⭐⭐ |
知识结构图
下面这张图帮你理清宿主机环境准备的整体脉络:
环境验证清单
不管你用哪种环境,装完后跑一遍这个清单,确保没有遗漏:
- QEMU 可用:
qemu-system-riscv64 --version输出正常 - 编译器可用:
gcc --version或clang --version输出正常 - Python 可用:
python3 --version不低于 3.8 - Git 可用:
git --version输出正常 - Ninja 可用:
ninja --version输出正常 - 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 工具链了。嗯,这部分才是真正的重头戏。