前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MIT 6.S081/Fall 2020 搭建risc-v与xv6开发调试环境

MIT 6.S081/Fall 2020 搭建risc-v与xv6开发调试环境

原创
作者头像
耀耀
修改2022-01-24 18:21:54
2.2K0
修改2022-01-24 18:21:54
举报
文章被收录于专栏:MIT 6.S081/Fall 2020

2022-01-19日更新

  1. 很多人用 M1 架构编译都出现了错误 然后我同样复现了错误并且找到了解决办法
  2. 更详细的描述了不同的安装过程

本篇文章主要记录一下学习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

如果安装成功 则显示如下:

mit-make-gdb-install
mit-make-gdb-install

配置环境变量

代码语言: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

显示如下代表运行成功

mit-make-qemu
mit-make-qemu

使用 qemu-gdb 对 xv6进行调试

需要2个窗口(终端)

窗口1

代码语言:shell
复制
cd xv6-riscv
make CPUS=1 qemu-gdb

显示如下 这样代表启动成功 qemu-gdb

mit-make-qemu-gdb
mit-make-qemu-gdb

窗口2

代码语言:shell
复制
cd xv6-riscv
riscv64-unknown-elf-gdb

显示如下 这样代表成功

mit-riscv-gdb
mit-riscv-gdb

注: xv6-riscv 目录下有 .gdbinit 配置 有的情况下 riscv64-unknown-elf-gdb 会自动加载 如果没有自动加载则需要你手动 source .gdbinit 当打印 0x0000000000001000 in ?? () 代表可以调试。

参考资料:

  1. https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter0/5setup-devel-env.html#qemu
  2. https://github.com/riscv-software-src/homebrew-riscv
  3. https://github.com/riscv-software-src/homebrew-riscv/issues/47
  4. https://github.com/riscv-collab/riscv-gnu-toolchain
  5. https://zhayujie.com/mit6828-env.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我的环境:
  • 前提(必须安装):
    • 关于 GCC / LLVM + CLANG(可选)
    • 安装 riscv-gnu-toolchain
      • 1. 使用 brew 进行安装(可选)
        • 2. 源码编译安装(可选)
          • 3. 直接使用预编译版本(可选)
            • 4. 验证是否安装成功
            • 安装 Qemu
              • 1. 使用 brew 安装(可选)
                • 2. 使用源码安装(可选)
                  • 3. 验证是否安装成功
                  • 编译及运行 xv6
                  • 使用 qemu-gdb 对 xv6进行调试
                    • 窗口1
                      • 窗口2
                      • 参考资料:
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档