2022-01-19日更新
- 很多人用 M1 架构编译都出现了错误 然后我同样复现了错误并且找到了解决办法
- 更详细的描述了不同的安装过程
本篇文章主要记录一下学习MIT6.S081课程部署实验环境的详细过程。
课程链接:https://pdos.csail.mit.edu/6.S081/2020/
我的环境:
电脑型号:MacBook Pro (14-inch, 2021)
系统版本:macOS Monterey 12.1
我的笔记本是 arm64(M1芯片) 架构的,但此篇文章适用于 M1 及 Intel。
前提(必须安装):
默认情况下需要安装 brew 后面很多地方都需要用到此工具
代码语言:shell复制# 安装Brew 如果已经安装了可以下一步
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 检查是否安装成功
brew -v
# 打印以下内容代表成功
Homebrew 3.3.11-21-gec389a6
Homebrew/homebrew-core (git revision 68defcb5dd3; last commit 2022-01-18)
Homebrew/homebrew-cask (git revision c6cfd6f92b; last commit 2022-01-18)
# 安装基本依赖环境
brew install python3 gawk gnu-sed gmp mpfr libmpc isl zlib expat gsed
brew tap discoteq/discoteq
brew install flock
# Qemu 需要依赖ninja
brew install ninja
关于 GCC / LLVM CLANG(可选)
Mac 默认情况下预装的环境是 LLVM CLANG 而不是 GCC 虽然有 GCC 的命令 但是其实是 CLANG
测试如下 执行 gcc -v:
代码语言:shell复制gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c /4.2.1
Apple clang version 13.0.0 (clang-1300.0.29.30)
Target: arm64-apple-darwin21.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
在编译 riscv-gnu-toolchain 工具链的时候,本机是 GCC 还是 LLVM CLANG 都不会影响,我亲测都可以编译成功,所以这个地方可以保持默认,如果需要安装GCC 来替换 LLVM CLANG 可以按照以下步骤操作:
代码语言:shell复制# 安装
brew install gcc
# 版本为gcc 11.2.0_3
# 设置环境变量:
# 把以下内容添加到 ~/.zshrc 或者 ~/.bash_profile 或者 /etc/profile
# 因为我使用的是zsh 所以配置到 ~/.zshrc 里
vim ~/.zshrc
# 增加以下内容
export GCCPATH=/opt/homebrew/Cellar/gcc/11.2.0_3/
export PATH=$PATH:${GCCPATH//://bin:}/bin
alias gcc='gcc-11'
alias cc='gcc-11'
alias g ='g -11'
alias c ='c -11'
# 使环境生效
source ~/.zshrc
# 测试
gcc -v
Using built-in specs.
COLLECT_GCC=gcc-11
COLLECT_LTO_WRAPPER=/opt/homebrew/Cellar/gcc/11.2.0_3/bin/../libexec/gcc/aarch64-apple-darwin21/11/lto-wrapper
Target: aarch64-apple-darwin21
....省略
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.2.0 (Homebrew GCC 11.2.0_3)
安装 riscv-gnu-toolchain
以下安装选一个即可 你怎么开心怎么选 我用的是 2.源码编译安装
1. 使用 brew 进行安装(可选)
我用了这个步骤安装 会出现一些问题 所以此处需要看运气了。
代码语言:shell复制brew tap riscv-software-src/riscv
brew install riscv-tools
2. 源码编译安装(可选)
克隆源码
代码语言:shell复制git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
我安装的版本
riscv-gnu-toolchain commit: f640044a947afb39c78b96fa1ba1db8aa31b1d89 tag: 2022.01.17
qemu commit: 553032db17440f8de011390e5a1cfddd13751b0b tag: v5.2.0
riscv-binutils commit: 116a737f438d03a1bd6aa706b6ea0b4022f3b7e2(riscv-binutils-2.37)
riscv-dejagnu commit: 4ea498a8e1fafeb568530d84db1880066478c86b(riscv-dejagnu-1.6)
riscv-gcc commit: ca312387ab141060c20c388d83d6fc4b2099af1d(riscv-gcc-10.2.0)
riscv-gdb commit: 5da071ef0965b8054310d8dde9975037b0467311(fsf-gdb-10.1-with-sim)
riscv-glibc commit: 9826b03b747b841f5fc6de2054bf1ef3f5c4bdf3 tag: glibc-2.33
riscv-newlib commit: 415fdd4279b85eeec9d54775ce13c5c412451e08 tag: newlib-4.1.0
源码很大 6.5G左右 所以克隆的时候会很慢 可以先克隆主仓库 分开克隆子仓库
代码语言:shell复制git clone https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git submodule update --init --recursive
百度云中下载我这边上传好的 可以直接下载解压
地址:源码包 提取码:nmvw
包名: riscv-gnu-toolchain-src-2022-01-17.tar.gz
编译安装
(重要)注: 如果你的 Mac 是 arm 架构 M1 系列的芯片 需要改个配置
修改如下:
代码语言:shell复制# 进入目录
cd riscv-gnu-toolchain
# 注销配置
# 编辑文件
vim riscv-gcc/gcc/config.host
# 注销96行 97行
96 #out_host_hook_obj=host-darwin.o
97 #host_xmake_file="${host_xmake_file} x-darwin"
编译 耗时较长 慢慢等待吧 目测要1小时左右
代码语言:shell复制cd riscv-gnu-toolchain
./configure --prefix=/opt/riscv-gnu-toolchain --with-cmodel=medany --enable-multilib
# 因为安到opt目录下所以加了sudo 如果不安装在这个目录下 可以不使用sudo
sudo make
如果安装成功 则显示如下:
配置环境变量
代码语言:shell复制# 把以下内容添加到 ~/.zshrc 或者 ~/.bash_profile 或者 /etc/profile
# 因为我使用的是zsh 所以配置到 ~/.zshrc 里
export RISCV_HOME=/opt/riscv-gnu-toolchain
export PATH=${PATH}:${RISCV_HOME}/bin
# 用 source 命令 让环境变量重新加载
source ~/.zshrc
3. 直接使用预编译版本(可选)
下载:
x86_64(intel)
地址:源码包 提取码:nmvw
包名: riscv-gnu-toolchain-bin-2020.04.01-x86_64-apple-darwin.tar.gz
aarm(m1)
地址:源码包 提取码:nmvw
包名: riscv-gnu-toolchain-bin-2022.01.18-arm64-apple-darwin.tar.gz
解压
代码语言:shell复制tar xf {上面你下载的包名} -C /opt/
ls /opt/riscv-gnu-toolchain
drwxr-xr-x 33 root wheel 1056 Jan 19 09:39 bin
drwxr-xr-x 3 root wheel 96 Jan 19 09:39 include
drwxr-xr-x 8 root wheel 256 Jan 19 09:39 lib
drwxr-xr-x 3 root wheel 96 Jan 18 23:54 libexec
drwxr-xr-x 5 root wheel 160 Jan 18 23:59 riscv64-unknown-elf
drwxr-xr-x 7 root wheel 224 Jan 19 09:39 share
配置环境变量
代码语言:shell复制# 把以下内容添加到 ~/.zshrc 或者 ~/.bash_profile 或者 /etc/profile
# 因为我使用的是zsh 所以配置到 ~/.zshrc 里
export RISCV_HOME=/opt/riscv-gnu-toolchain
export PATH=${PATH}:${RISCV_HOME}/bin
# 用 source 命令 让环境变量重新加载
source ~/.zshrc
4. 验证是否安装成功
代码语言:shell复制//执行
riscv64-unknown-elf-gcc -v
// 如打印以下内容代表安装成功
riscv64-unknown-elf-gcc -v
Using built-in specs.
COLLECT_GCC=riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv-gnu-toolchain/libexec/gcc/riscv64-unknown-elf/11.1.0/lto-wrapper
Target: riscv64-unknown-elf
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 11.1.0 (GCC)
安装 Qemu
qemu 是强大的虚拟机操作系统模拟器,在此课程中,我们使用 qemu 来模拟硬件 ,使 xv6 运行在该模拟器之上。
我安装的 qemu 版本为 6.2.0
**以下安装选一个即可 你怎么开心怎么选 我用的是 1.使用 brew 安装
1. 使用 brew 安装(可选)
代码语言:shell复制// 本人就使用了这种方式进行安装
brew install qemu
2. 使用源码安装(可选)
下载源码并编译安装
代码语言:shell复制wget https://download.qemu.org/qemu-6.2.0.tar.xz
tar xf qemu-6.2.0.tar.xz
cd qemu-6.2.0
./configure --prefix=/opt/qemu
make
make install
配置环境变量
代码语言:shell复制# 把以下内容添加到 ~/.zshrc 或者 ~/.bash_profile 或者 /etc/profile
# 因为我使用的是zsh 所以配置到 ~/.zshrc 里
export QEMU_HOME=/opt/qemu
export PATH=${PATH}:${QEMU_HOME}/bin
# 用 source 命令 让环境变量重新加载
source ~/.zshrc
3. 验证是否安装成功
代码语言:shell复制// 执行 如果打印以下内容代表安装成功
qemu-system-riscv64 --version
QEMU emulator version 6.1.0
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
编译及运行 xv6
克隆
代码语言:shell复制git clone https://github.com/mit-pdos/xv6-riscv.git
编译
代码语言:shell复制cd xv6-riscv
make
使用 qemu 运行
代码语言:shell复制make qemu
显示如下代表运行成功
使用 qemu-gdb 对 xv6进行调试
需要2个窗口(终端)
窗口1
代码语言:shell复制cd xv6-riscv
make CPUS=1 qemu-gdb
显示如下 这样代表启动成功 qemu-gdb
窗口2
代码语言:shell复制cd xv6-riscv
riscv64-unknown-elf-gdb
显示如下 这样代表成功
注: xv6-riscv
目录下有 .gdbinit
配置 有的情况下 riscv64-unknown-elf-gdb
会自动加载 如果没有自动加载则需要你手动 source .gdbinit
当打印 0x0000000000001000 in ?? ()
代表可以调试。
参考资料:
- https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter0/5setup-devel-env.html#qemu
- https://github.com/riscv-software-src/homebrew-riscv
- https://github.com/riscv-software-src/homebrew-riscv/issues/47
- https://github.com/riscv-collab/riscv-gnu-toolchain
- https://zhayujie.com/mit6828-env.html