废话一箩筐:最近在看jyy的操作视频课程,里面讲到xv6-risvc的内容,咱也来尝试一下吧~~~

qemu版本:要求qemu7.2及以上!!qemu7.2及以上!!qemu7.2及以上!!

一、下载xv6-riscv源码

执行以下命令从github上clone xv6-riscv的源码:

$ git clone https://github.com/mit-pdos/xv6-riscv.git
$ # 下载的源码结构
$ tree -L2
.
└── xv6-riscv
    ├── kernel
    ├── LICENSE
    ├── Makefile
    ├── mkfs
    ├── README
    ├── test-xv6.py
    └── user

5 directories, 4 files

二、编译xv6-riscv

2.1 信心十足,开干

拿到代码后,自己傻了似得直接 cd 到 xv6-riscv目录下,执行了make,然后华丽丽的报错啦~~

$ make
***
*** Error: Couldn't find a riscv64 version of GCC/binutils.
*** To turn off this error, run 'gmake TOOLPREFIX= ...'.
***
/bin/sh: 1: qemu-system-riscv64: not found
gcc -g -c -o kernel/entry.o kernel/entry.S
kernel/entry.S: Assembler messages:
kernel/entry.S:12: Error: no such instruction: `la sp,stack0'
kernel/entry.S:13: Error: no such instruction: `li a0,1024*4'
kernel/entry.S:14: Error: no such instruction: `csrr a1,mhartid'
kernel/entry.S:15: Error: no such instruction: `addi a1,a1,1'
kernel/entry.S:16: Error: too many memory references for `mul'
kernel/entry.S:17: Error: too many memory references for `add'
kernel/entry.S:21: Error: no such instruction: `j spin'
make: *** [Makefile:92: kernel/entry.o] Error 1

要先配置编译环境啦~~~对自己无语啦o(╥﹏╥)o

2.2 配置编译环境

执行以下命令安装RISC-V工具链:

sudo apt update
# 安装编译器、汇编器、链接器等必要的二进制工具
sudo apt install gcc-riscv64-unknown-elf binutils-riscv64-unknown-elf
# 安装完成后,通过以下命令检查编译器是否可用
$ riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc () 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

执行以下命令从源码编译安装qemu-system-riscv64:

# https://www.qemu.org/download/#source qemu最新版本网站
wget https://download.qemu.org/qemu-7.0.0.tar.xz
tar xvJf qemu-7.0.0.tar.xz
cd qemu-7.0.0
mkdir build-riscv
mkdir install-riscv
cd build-riscv
#  将prefix参数中的xxxx替换成你本地的路径
../configure --target-list=riscv64-softmmu --prefix=xxxx/qemu-7.0.0/install-riscv
make -j36
make install

编译安装完成后,查看安装的文件结构:

 $ pwd
/home/xxx/workspace/debug_linux_on_qemu/qemu-7.0.0/build-riscv
$ tree -L1
.
├── config-host.mak
├── config.log
├── config-meson.cross
├── config-temp
├── contrib
├── linux-headers
├── Makefile -> /home/xxx/workspace/debug_linux_on_qemu/qemu-7.0.0/Makefile
├── meson-info
├── meson-logs
├── meson-private
├── pc-bios
├── python -> /home/xxx/workspace/debug_linux_on_qemu/qemu-7.0.0/python
├── riscv64-softmmu
├── roms
├── scripts -> /home/xxx/workspace/debug_linux_on_qemu/qemu-7.0.0/scripts
└── tests

13 directories, 4 files

将安装的qemu-system-riscv64配置到环境变量,然后检查qemu的版本:

$ qemu-system-riscv64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers

2.3 信心十足,重新开干

$ make
riscv64-unknown-elf-gcc -g -c -o kernel/entry.o kernel/entry.S
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -g -c -o kernel/swtch.o kernel/swtch.S
riscv64-unknown-elf-gcc -g -c -o kernel/trampoline.o kernel/trampoline.S
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -g -c -o kernel/kernelvec.o kernel/kernelvec.S
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-gcc -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodelc
riscv64-unknown-elf-ld -z max-page-size=4096 -T kernel/kernel.ld -o kernel/kernel kernel/entry.o kernel/start.o kerne 
riscv64-unknown-elf-objdump -S kernel/kernel > kernel/kernel.asm
riscv64-unknown-elf-objdump -t kernel/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel/kernel.sym

啦啦啦,看我编译过了吧()。执行xv6-riscv,然后:

# 执行make qemu直接编译运行
$ make qemu
ERROR: Need qemu version >= 7.2
make: *** [Makefile:189: check-qemu-version] Error 1

苍天大老爷啊,版本竟然不对!!!!o(╥﹏╥)o
如果遇到这个问题,请参考[2.4 安装qemu-8.0.0版本]

qemu版本的问题解决后,重新运行xv6-rsicv,发现可以进入到系统了:
xv6-riscv
完结~~撒花~

2.4 安装qemu-8.0.0版本

回炉重造,重新下载更高版本的qemu,并进行编译与安装,命令如下:

# https://www.qemu.org/download/#source qemu最新版本网站
wget https://download.qemu.org/qemu-8.0.0.tar.xz
tar xvJf qemu-8.0.0.tar.xz
cd qemu-8.0.0
mkdir build
mkdir install
cd build
#  将prefix参数中的xxxx替换成你本地的路径。在做configure的时候,出现了一些报错,请参考[2.4.1 qemu配置及编译错误解决]
../configure --target-list=riscv64-softmmu --prefix=xxxx/qemu-8.0.0/install
make -j8
make install
# 将qemu的安装路径配置到环境变量,设置PATH
# 检查qemu是否安装,已经安装的版本:
$ qemu-system-riscv64 --version
QEMU emulator version 8.0.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers

2.4.1 qemu配置及编译错误解决

问题1:

描述:执行 …/configure --target-list=riscv64-softmmu --prefix=xxxx/qemu-10.1.0/install-riscv 时,报python3版本过低,只要需要python 3.9.0
解决方法:安装新版本的python,参考 https://blog.csdn.net/PoppuHengheng/article/details/151407934?spm=1011.2124.3001.6209

问题2

描述:执行…/configure --target-list=riscv64-softmmu --prefix=xxxx/qemu-10.1.0/install-riscv时,报以下错误

Run-time dependency glib-2.0 found: NO 

../meson.build:1045:10: ERROR: Dependency lookup for glib-2.0 with method 'pkgconfig' failed: Invalid version, need 'glib-2.0' ['>=2.66.0'] found '2.64.6'.

A full log can be found at /home/bushuping/workspace/operationsystem/demo/xv6-riscv/qemu/qemu-10.1.0/build-riscv/meson-logs/meson-log.txt

解决方法:降低qemu版本,放过自己,重新安装qemu8.0.0版本。【鄙视自己!】

编译xv6-rsicv代码的步骤就到这啦,希望对看到这篇文章的你有所帮助~~~祝看到这篇笔记的你开心。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐