0%

xv6-2020-macOS前期准备

mac

我的设备用的是mbp2018款的,操作系统用的是macOS: 11.2.1-x86_64(Big Sur)

xv6的绝大部分的按照这个教程走即可。

对于拥有Homebrew来说其实只需要:

1
2
3
4
$ brew tap riscv/riscv				// 设置brew源
$ brew install riscv-tools // 安装对应的工具
PATH=$PATH:/usr/local/opt/riscv-gnu-toolchain/bin // 加入到路径中
$ brew install qemu // 安装虚拟机

一套安装下来,如果命令riscv64-unknown-elf-gcc --version可以输出riscv架构下的gcc的版本号,说明gcc安装成功。同理qemu-system-riscv64 --version如果输出了qemu的版本号,说明qemu安装成功。

到这里,如果能够成功启动xv6,那么基本上可以说安装成功了。

为什么说是基本上呢?我自己在使用riscv64-unknown-elf-gdb进行调试的时候,遇到了一个问题:

gdb显示错误信息:symbol format 'elf64-littleriscv' unknown.

然后上网搜了一下,发现有一个类似的问题,是清华的一个操作系统课上有同学遇到的问题,最后定位的问题应该是gdb的版本问题。

首先来看一下我当前的设备所用的gdb版本:riscv64-unknown-elf-gdb --version,是10.1,而网上说的是gdb9.1版本是没有问题的。

那么要怎么做呢?由于我们的riscv版本的gdb版本是通过riscv-tools进行安装的,而riscv-tools的信息如下:

1
2
3
4
5
6
7
8
$ brew info riscv-tools
riscv/riscv/riscv-tools: stable 0.2
RISC-V toolchain including gcc (with newlib), simulator (spike), and pk
http://riscv.org
Not installed
From: https://github.com/riscv/homebrew-riscv/blob/HEAD/riscv-tools.rb
==> Dependencies
Required: riscv-gnu-toolchain ✔, riscv-isa-sim ✔, riscv-pk ✔

显然就是riscv-gnu-toolchain这个依赖中包含了对应的gdb了,所以我们先把这四个全都利用brew卸载(其实只需要卸载riscv-tools和riscv-gnu-toolchain即可),然后去这个对应的git仓库中,查看它的commit记录,找到较低版本的toolchain。这个我自己找的一个catalina版本下的:https://raw.githubusercontent.com/riscv/homebrew-riscv/84982f37f730da89ce78b2a93dcf4c630c176df4/riscv-gnu-toolchain.rb

我们只需要利用这个rb文件来进行安装就可以了。

安装成功查看了一下gdb的版本,嗯,确实是9.1了,当我开开心心去调试的时候,发现悲剧了:can't find include/stdarg.h,显然是这个针对catalina版本的路径设置有问题或者是缺少文件。

最后我想了一个终极缝合的办法:把catalina的gdb的二进制文件复制出来,然后重新安装最新的riscv-tools,然后把编译啥的用最新的那个tool-chain,但是调试的话用这个旧的二进制文件。结果完全没问题,可行!

ubuntu

官网推荐的apt下载的qemu的版本有点问题,然后它自己也说了需要通过下面的命令手动安装较旧的版本:

1
2
$ sudo apt-get remove qemu-system-misc
$ sudo apt-get install qemu-system-misc=1:4.2-3ubuntu6

然后这个版本的包根本找不到,我试了各种方法都不行。后来发现这个包需要Ubuntu20.04才可以。

也就是如果希望能够在ubuntu上模拟xv6,Ubuntu的最低版本应该是需要20.04。

riscv指令简单介绍

在写操作系统的时候,必不可少会需要遇到一些指令,这里仅做简单的说明,仅仅是从为了读懂代码的角度出发。

  • csrr a,b:把b的值读入到a中。
  • sd a,b:将a中的值读入b中。
  • ld a,b:将b中的值读入到a中。