6.S081的调试和VSCode环境配置

6.S081的调试和VSCode环境配置,还有一些踩坑和小技巧,杂七杂八的都放在这一篇里面了。(遇到什么情况就更新,准备一直更到做完Lab)

准备环境

我手头只有ARM的板子(树莓派3B+一个和stm32若干),市面上risc-v的板子都不便宜,比如BeagleV的这个。这些板子我都眼馋好久了,一直没舍得买。不能像ARM那样直接玩板子了。

另一种曲线救国的方法是蹭个FPGA来 ,在FPGA上烧一个。坏消息是FPGA更贵,而且我要蹭到FPGA还得跑到清水河校区去。

好消息是我们可以用qemu模拟一个,就像模拟ARM一样。

直接参照这里来就好了。如果没有自带的包,可能会编译比较久。

https://pdos.csail.mit.edu/6.828/2020/tools.html

Archlinux可以用pacman装这四个包,都在comunity源里。

sudo pacman -S riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb qemu-arch-extra

然后测试一下:

riscv64-linux-gnu-gcc --version
qemu-system-riscv64 --version

测试一下编译运行xv6

git clone git://github.com/mit-pdos/xv6-riscv.git
cd xv6-risvv
make qemu

结果发现不行,卡在这里不动了。搜了一下Archlinux就官网这一句话教程,也没别人遇到相同的问题(随手一搜arch的教程全是ubuntu的结果)。

qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

依我用Archlinux的踩坑血泪史,八成是版本太高了。降级qemu-arch-extra 6.0.0一下试试,降级到跟官方页面上一致的版本5.1.0

sudo downgrade qemu-arch-extra

紧接着又报了这个错:

qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
qemu-system-riscv64: error while loading shared libraries: liburing.so.1: cannot open shared object file: No such file or directory
make: *** [Makefile:165: qemu] Error 127

找不到io_uring的动态链接库,没关系,我们而再降级一下liburing或者自己下一个动态链接库趁系统不注意偷偷塞到/usr/lib之类的地方就好了。io_uring虽然很重要,但是查了依赖,我目前只有qemu直接依赖liburing(还有一个virtualbox的vde2是optionally requires),那就直接降级吧。

sudo downgrade liburing

然后一个sh就出现了,按Ctrl-a x退出。

到这里准备环境就好了,耗时10分钟。(用了降级系统包版本的脏办法,io_uring这么重要的东西自己乱换版本不太好,不过目前直接依赖系统liburing的包不多)

更新

受不了坑位上7年前采购的老电脑的编译速度了,换教研室的20核服务器远程编译了。为了方便先将Ubuntu Server强行

sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu

直接make qemu试试,耗时5s,舒服了

image-20210702145048984

Hello, World

写一个helloworld看看是不是真的好了。

在user目录里面直接新建一个hello.c

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

int
main(int argc, char *argv[])
{
  printf("Hello, nerd!\n");
  exit(0);
}

然后在Makefile里面修改,加上$U/_hello\

UPROGS=\
	$U/_cat\
	$U/_echo\
	$U/_forktest\
	$U/_grep\
	$U/_hello\
	$U/_init\
	$U/_kill\

然后编译运行:

make qemu

(注意不要用return 0,用exit(0)终止进程,或者你喜欢单片机的裸机的写法不要返回直接void main也行)

(Make sure main calls exit() in order to exit your program. )

$ hello
Hello, nerd!

image-20210702150654556

gdb+qemu调试

现在6.S081推荐用gdb-multiarch这个包。 然后开两个shell, 一个

(gdb) target remote localhost:26000

VSCode配置

代码提示和自动补全

关于clion等IDE

我害怕自己被IDE惯坏,第一个Lab用的VSCode,还把代码提示

clion的配置可以参考 https://zhuanlan.zhihu.com/p/166413604