$ git clone git://g.csail.mit.edu/xv6-labs-2020
Cloning into 'xv6-labs-2020'...
...
$ cd xv6-labs-2020
$ git checkout util
Branch 'util' set up to track remote branch 'util' from 'origin'.
Switched to a new branch 'util'
Error: Couldn't find a riscv64 version of GCC/binutils.
apt search binutils |grep binutils-riscv64
sudo apt install binutils-riscv64-linux-gnu
sudo apt install binutils-riscv64-linux-gnu-dbg
sudo apt install binutils-riscv64-unknown-elf
make: riscv64-unknown-elf-gcc: Command not found
sudo apt install gcc-10-riscv64-linux-gnu
sudo ln -s riscv64-linux-gnu-gcc-10 riscv64-unknown-elf-gcc
git clone https://github.com/qemu/qemu.git
gitee镜像下载链接: git clone https://gitee.com/mirrors/qemu
更简单快速的方法可以下载qemu源码压缩包:
wget https://download.qemu.org/qemu-5.2.0.tar.xz
tar -xf qemu-5.2.0.tar.xz
cd qemu-5.2.0
mkdir build && cd build
../configure --target-list=riscv64-softmmu && make
ERROR: Cannot find Ninja
sudo apt install ninja-build
ERROR: pkg-config binary 'pkg-config' not found
sudo apt install pkg-config
ERROR: glib-2.56 gthread-2.0 is required to compile QEMU
sudo apt install libglib2.0-dev
../meson.build:840:11: ERROR: Dependency "pixman-1" not found, tried pkgconfig
sudo apt install libpixman-1-dev
No C++ compiler available; disabling C++ specific optional code
sudo apt install g++
../configure --target-list=riscv64-softmmu && make
即可。sudo cp qemu-system-riscv64 /usr/bin/
xv6 需要依赖两个工具,一个是 GCC/Binutils,一个是 QEMU。
需要注意的是,这两个工具都需要是 RISC-V 版本的,因为 xv6 是依赖 RISC-V 指令集架构的。
$ make qemu
riscv64-unknown-elf-gcc -c -o kernel/entry.o kernel/entry.S
riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -DSOL_UTIL -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o kernel/start.o kernel/start.c
...
riscv64-unknown-elf-ld -z max-page-size=4096 -N -e main -Ttext 0 -o user/_zombie user/zombie.o user/ulib.o user/usys.o user/printf.o user/umalloc.o
riscv64-unknown-elf-objdump -S user/_zombie > user/zombie.asm
riscv64-unknown-elf-objdump -t user/_zombie | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > user/zombie.sym
mkfs/mkfs fs.img README user/xargstest.sh user/_cat user/_echo user/_forktest user/_grep user/_init user/_kill user/_ln user/_ls user/_mkdir user/_rm user/_sh user/_stressfs user/_usertests user/_grind user/_wc user/_zombie
nmeta 46 (boot, super, log blocks 30 inode blocks 13, bitmap blocks 1) blocks 954 total 1000
balloc: first 591 blocks have been allocated
balloc: write bitmap block at sector 45
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
xv6 kernel is booting
hart 2 starting
hart 1 starting
init: starting sh
$
$ ls
. 1 1 1024
.. 1 1 1024
README 2 2 2059
xargstest.sh 2 3 93
cat 2 4 24256
echo 2 5 23080
forktest 2 6 13272
grep 2 7 27560
init 2 8 23816
kill 2 9 23024
ln 2 10 22880
ls 2 11 26448
mkdir 2 12 23176
rm 2 13 23160
sh 2 14 41976
stressfs 2 15 24016
usertests 2 16 148456
grind 2 17 38144
wc 2 18 25344
zombie 2 19 22408
console 3 20 0
这些是mkfs在初始文件系统中包含的文件;大多数是可以运行的程序。你刚刚跑了其中一个:ls。
xv6没有ps命令,但是如果您键入Ctrl-p
,内核将打印每个进程的信息。如果现在尝试,您将看到两行:一行用于init,另一行用于sh。
退出 qemu : Ctrl-a x
。