mac
我的设备用的是mbp2018款的,操作系统用的是macOS: 11.2.1-x86_64(Big Sur)
xv6的绝大部分的按照这个教程走即可。
对于拥有Homebrew来说其实只需要:
1 | brew tap riscv/riscv // 设置brew源 |
一套安装下来,如果命令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 | brew info riscv-tools |
显然就是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 | sudo apt-get remove qemu-system-misc |
然后这个版本的包根本找不到,我试了各种方法都不行。后来发现这个包需要Ubuntu20.04才可以。
也就是如果希望能够在ubuntu上模拟xv6,Ubuntu的最低版本应该是需要20.04。
riscv指令简单介绍
在写操作系统的时候,必不可少会需要遇到一些指令,这里仅做简单的说明,仅仅是从为了读懂代码的角度出发。
- csrr a,b:把b的值读入到a中。
- sd a,b:将a中的值读入b中。
- ld a,b:将b中的值读入到a中。