xv6是 麻省理工的一个教学操作系统,是 Dennis Ritchie 和 Ken Thompson 的 Unix 的重新实现版本 6 (v6)。 被广泛应用于操作系统教学课程,现有x86和RISC-V版本。其中x86版本已停止维护和更新。
LoongArch是由我国龙芯中科研发的自主指令系统(龙芯架构)。
本项目将xv6移植到LoongArch平台上,感谢张福新老师提供的初始版本,下面将介绍如何在Ubuntu 20.04中通过QEMU模拟器(在PC上模拟LoongArch硬件)编译xv6并运行调试。
为了能编译在LoongArch下运行的xv6内核,需要下载交叉编译工具链。
wget https://github.com/loongson/build-tools/releases/download/2022.05.29/loongarch64-clfs-5.0-cross-tools-gcc-full.tar.xz
sudo tar -vxf loongarch64-clfs-5.0-cross-tools-gcc-full.tar.xz -C /opt
配置交叉编译工具的环境变量
. setenv.sh
setenv.sh
是一个用于设置环境变量的脚本文件
#!/bin/sh
set -x
CC_PREFIX=/opt/cross-tools
export PATH=$CC_PREFIX/bin:$PATH
export LD_LIBRARY_PATH=$CC_PREFIX/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$CC_PREFIX/loongarch64-unknown-linux-gnu/lib/:$LD_LIBRARY_PATH
set +x
上述的命令只是临时设置环境变量,如需永久设置,可通过修改/etc/profile实现; 通过命令检验是否设置成功
loongarch64-unknown-linux-gnu-gcc --version
下载xv6-loongarch
git clone --recurse-submodules https://github.com/SKT-CPUOS/xv6-loongarch-exp.git
cd xv6-loongarch-exp
开始编译
make all
当前路径下会生成fs.img
文件,\kernel
下也会生成所有链接时需要的*.o, *.d等文件,以及最终的kernel
二进制文件
cd qemu-loongarch-runenv
通过脚本文件./run_loongarch.sh
的-k参数,指定我们编译好的xv6-loongarch内核,即可启动仿真运行
./run_loongarch.sh -k ../kernel/kernel
(如果提示有缺少的库,则按提示安装即可
例如: 如果提示缺少spice-server 可以尝试: apt install -y libspice-server-dev
如果提示缺少libSDL2-2.0.so.0 可以尝试:sudo apt-get install -y libsdl2-2.0-0
如果提示缺少libfdt.so.1 可以尝试:sudo apt-get install libfdt-dev
如果提示缺少libusbredirparser.so.1 可以尝试:sudo apt-get install libusbredirparser-dev
如果提示缺少libfuse3.so.3 可以尝试:sudo apt-get install libfuse3-dev fuse3
请根据自己系统的具体情况进行相应的完善)
启动后如下图所示,按下“Ctrl” + “A”组合键,松开后再按"X"来退出QEMU。
安装一些必要依赖,根据编译时的报错情况自行安装所需依赖
sudo apt install texinfo bison flex libgmp-dev
编译gdb工具,大概需要等待几分钟的时间
git clone https://github.com/foxsen/binutils-gdb
cd binutils-gdb
git checkout loongarch-v2022-03-10
mkdir build
cd build
../configure --target=loongarch64-unknown-linux-gnu --prefix=/opt/gdb
make
make install
使用-D参数启动调试模式,实际上是执行调试服务器gdbserver的角色,默认监听TCP::1234端口,等待gdb客户端的接入。
./run_loongarch.sh -k ../kernel/kernel -D
此时在另一个终端上启动gdb,并指定被调试对象(编译好的kernel文件路径)
/opt/gdb/bin/loongarch64-unknown-linux-gnu-gdb ../kernel/kernel
在gdb命令提示符下执行target remote :1234
命令连接到xv6目标系统上
target remote :1234
使用b
命令在kernel/main.c的函数入口设置断点,并使用c
命令继续执行xv6内核代码,直到碰到断点
此时xv6的输出窗口中显示了相应的启动过程,但由于设置了断点,仍未到达shell的初始化。
- r(run)
- c(continue)
- n(next)
- s(step)
- q(quit)
- b(break n
- i(info) stack
- i register
- i thread