diff --git a/_posts/2023-10-30-23-44-25-xv6-start-on-qemu.md b/_posts/2023-10-30-23-44-25-xv6-start-on-qemu.md new file mode 100644 index 000000000..27e794475 --- /dev/null +++ b/_posts/2023-10-30-23-44-25-xv6-start-on-qemu.md @@ -0,0 +1,197 @@ +--- +layout: post +author: 'cola2003' +title: '在 QEMU 上运行 xv6' +draft: false +album: 'RISC-V Linux' +license: 'cc-by-nc-nd-4.0' +permalink: /xv6-start-on-qemu/ +description: '在 QEMU 上运行 xv6' +category: + - 开源项目 + - Risc-V +tags: + - Linux + - RISC-V +--- + +> Author: cola2003 <1952088712@qq.com> +> Date: 2022/10/06 +> Revisor: Falcon +> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux) +> Sponsor: SOPHGO +> Proposal: +> Environ: [Linux Lab Disk](https://tinylab.org/linux-lab-disk) + + +## 前言 + +xv6 是麻省理工学院开发的经典的教育性操作系统,适合学习操作系统原理和内核开发,它设计简洁,代码清晰,适合深入学习操作系统的内部机制。有助于理解实际操作系统的实现和原理,是学习操作系统的极佳选择。本文将带领大家搭建起 xv6 的 QEMU 实验环境,为进一步的学习与实验打下坚实的基础。 + +## 环境准备 + +这里需要准备的工具有: +- RISC-V 交叉编译工具链 +- QEMU + +如果确实是 Linux 新手或不喜欢无聊的安装过程,想节省这些编译各种工具的造轮子时间,更加专注于实验,可以使用我们泰晓社区的自研产品 [泰晓 Linux 实验盘](https://tinylab.org/linux-lab-disk),在某宝检索 “泰晓 Linux” 即可选购。 + +### 制作交叉编译工具链 + +**说明**:如果采用泰晓 Linux 实验盘,该节的所有繁琐步骤可以完全省略,实验盘中的 Linux Lab 环境提供了完整的 RISC-V 交叉编译器。 + +笔者这里使用的环境是 Ubuntu20.04 LTS x86_64,工具链可以到 GitHub 官网下载源码然后进行编译。 + +``` +git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git +cd riscv-gnu-toolchain +git submodule update --init --recursive +``` + +但实际上我们并不建议这样做,因为 RISC-V 全套工具链太大了,而且因为是在 GitHub 上的缘故所以还需要翻墙,往往会卡在拉取子摸块的阶段,这些子模块包括: + +- riscv-qemu +- riscv-newlib(100MB) +- riscv-binutils(394MB) +- riscv-gdb(394MB) +- riscv-dejagnu(3MB) +- riscv-glibc(155MB) +- riscv-gcc (1.3GB) + +为了解决这个问题,可以拉取码云上的 [riscv-gnu-toolchain 镜像][001]。 + +``` +git clone https://gitee.com/mirrors/riscv-gnu-toolchain +cd riscv-gnu-toolchain +``` + +但是码云上的子模块地址仍然是 GitHub 的地址,所以要分别拉取其子摸块在码云上的镜像。 + +``` +riscv-newlib:https://gitee.com/mirrors/riscv-newlib +riscv-binutils:https://gitee.com/mirrors/riscv-binutils-gdb +riscv-gdb:https://gitee.com/mirrors/riscv-binutils-gdb(riscv-gdb 和 riscv-binutils 为同一个仓库下的不同分支) +riscv-dejagnu:https://gitee.com/mirrors/riscv-dejagnu +riscv-glibc:https://gitee.com/mirrors/riscv-glibc +riscv-gcc:https://gitee.com/mirrors/riscv-gcc +``` + +进行子模块的拉取。 + +``` +git clone https://gitee.com/mirrors/riscv-dejagnu +git clone -b riscv-gcc-10.2.0 https://gitee.com/mirrors/riscv-gcc +git clone -b riscv-glibc-2.29 https://gitee.com/mirrors/riscv-glibc +git clone https://gitee.com/mirrors/riscv-newlib +git clone -b riscv-binutils-2.35 https://gitee.com/mirrors/riscv-binutils-gdb riscv-binutils +git clone -b fsf-gdb-10.1-with-sim https://gitee.com/mirrors/riscv-binutils-gdb riscv-gdb + +``` + +我们使用的是 64 位的工具,直接使用下面的命令即可默认生成 64 位的编译工具: + +``` +# 安装依赖库 +sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev + +# riscv64-unknown-elf-*** +../configure --prefix=$RISCV +make -j4 + +# 安装至设定的 $RISCV 路径 +make install +#所需时间较长,请耐心等待 +``` + +最后在 ~/.bashrc 中添加环境变量,也可以使用 export,只是使用 export 环境变量的生效期只为当前终端。 + +``` +# 在 ~/.bashrc 中添加 +export RISCV=".your.path./riscv-gnu-toolchain" +export PATH=$PATH:$RISCV/bin +``` + +完成之后输入 `riscv64-unknown-elf-gcc -v`,若能出现类似如下的界面,则说明编译安装的工具链没有问题。 + +![start-lab-disk](/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/test-riscv-tool-chain.png) + +### 准备 QEMU + +**说明**:如果采用泰晓 Linux 实验盘,该节的很多繁琐步骤可以完全省略,实验盘中的 Linux Lab 环境提供了完整的 RISC-V QEMU 模拟器,也可以通过一条 `make qemu` 轻松编译出 QEMU,详细用法可以查看 [第四讲:QEMU 实验 - RISC-V Linux系统开发公开课](https://www.bilibili.com/video/BV1kz4y1K7fW)。 + +本次实验我们使用 qemu7.0.0,要下载 qemu-7.0.0.tar.xz,可以到 [qemu 官网][002] 上去下载,也可以使用下面的 wget 方式下载。 + +![start-lab-disk](/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/chose-qemu.jpg) + +``` +wget https://download.qemu.org/qemu-7.0.0.tar.xz +# 对其进行解压缩 +tar -xf qemu-7.0.0.tar.xz +# 安装依赖 +sudo apt-get install libglib2.0-dev ninja-build build-essential zlib1g-dev pkg-config libglib2.0-dev \ +binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev libpython-dev \ + virtualenv libmount-dev libpixman-1-dev +# 然后按照步骤编译安装 +./configure --target-list=riscv64-softmmu +make +sudo make install +``` + +### 准备 xv6 代码 + +克隆官网的代码,进入 xv6-riscv 目录,执行 `make qemu`。 + +``` +git clone https://github.com/mit-pdos/xv6-riscv.git +cd xv6-riscv && make qemu +``` + +![start-lab-disk](/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/my-xv6-start.png) + +可以看到我们已经进入 xv6 的 console 了。 + +## 使用泰晓实验盘 + +可以从 [泰晓开源小店](https://shop155917374.taobao.com/) 选购一枚即插即跑的 Linux Lab Disk。它也叫 “泰晓 Linux 实验盘”,可以在淘宝手机 App 内搜索 “泰晓 Linux” 后购买。 + +泰晓 Linux 实验盘的具体使用方法见 [Linux Lab Disk][003]。 + +按照使用方法进入之后界面如下。 + +![start-lab-disk](/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/start-lab-disk.png) + +双击 Linux Lab Shell 即可进入实验环境。 + +![start-lab-disk](/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/enter-linux-lab.png) + +Linux Lab 里集成了绝大多数我们要用的工具链,具体支持的工具链参见桌面上的手册,输入 RISC-V 后使用 tab 自动补全功能,可以看到我们可以直接使用这些工具,QEMU 也是如此。 + +![start-lab-disk](/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/show-tool-chain.png) + +克隆 xv6 代码,进入 xv6-riscv 目录,执行 `make qemu`。 + + +``` +git clone https://github.com/mit-pdos/xv6-riscv.git +cd xv6-riscv && make qemu +``` + +可以看到我们已经进入 xv6 的 console 了。 + +![start-lab-disk](/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/xv6-start.png) + +## 总结 + +本篇文章主要是带大家搭建起 xv6 的 QEMU 实验环境,并且尝试使用了我们泰晓社区的自研产品泰晓 Linux 实验盘,为我们进一步的学习打下了坚实的基础。 + +## 参考资料 + +- [riscv-mcu/riscv-gnu-toolchain][001] +- [https://www.qemu.org][002] +- [Linux Lab Disk 使用方法][003] +- [RISCV GNU 编译环境搭建与运行实践][004] + +[001]: https://gitee.com/riscv-mcu/riscv-gnu-toolchain +[002]: https://www.qemu.org/ +[003]: https://tinylab.org/linux-lab-disk/ +[004]: https://blog.csdn.net/ALLap97/article/details/112373544 diff --git a/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/chose-qemu.jpg b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/chose-qemu.jpg new file mode 100644 index 000000000..e197d24ee Binary files /dev/null and b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/chose-qemu.jpg differ diff --git a/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/download-xv6.png b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/download-xv6.png new file mode 100644 index 000000000..a2de0d60f Binary files /dev/null and b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/download-xv6.png differ diff --git a/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/enter-linux-lab.png b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/enter-linux-lab.png new file mode 100644 index 000000000..3280fd09e Binary files /dev/null and b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/enter-linux-lab.png differ diff --git a/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/my-xv6-start.png b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/my-xv6-start.png new file mode 100644 index 000000000..c3da016e6 Binary files /dev/null and b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/my-xv6-start.png differ diff --git a/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/show-tool-chain.png b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/show-tool-chain.png new file mode 100644 index 000000000..40d249d34 Binary files /dev/null and b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/show-tool-chain.png differ diff --git a/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/start-lab-disk.png b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/start-lab-disk.png new file mode 100644 index 000000000..bacda27d4 Binary files /dev/null and b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/start-lab-disk.png differ diff --git a/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/test-riscv-tool-chain.png b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/test-riscv-tool-chain.png new file mode 100644 index 000000000..1dc71247a Binary files /dev/null and b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/test-riscv-tool-chain.png differ diff --git a/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/xv6-start.png b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/xv6-start.png new file mode 100644 index 000000000..000823ba4 Binary files /dev/null and b/wp-content/uploads/2022/03/riscv-linux/images/20231006-xv6-start-on-qemu/xv6-start.png differ