uCore-Tutorial-Guide-2023S/source/chapter0/5setup-devel-env.rst

268 lines
11 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

实验环境配置
============
.. toctree::
:hidden:
:maxdepth: 4
本节我们将完成环境配置并成功运行 uCore-Tutorial-v3 。整个流程分为下面几个部分:
- 系统环境配置
- Riscv下 C 开发环境配置
- Qemu 模拟器安装
- 其他工具安装
- 运行 uCore-Tutorial
系统环境配置
-------------------------------
目前实验仅支持 Ubuntu18.04 + 操作系统。对于 Windows10 和 macOS 上的用户,可以使用 VMware 或
VirtualBox 安装一台 Ubuntu18.04 虚拟机并在上面进行实验。
特别的Windows10 的用户可以通过系统内置的 WSL2 虚拟机(请不要使用 WSL1来安装 Ubuntu 18.04 / 20.04 。
步骤如下:
- 升级 Windows 10 到最新版Windows 10 版本 18917 或以后的内部版本)。注意,如果
不是 Windows 10 专业版,可能需要手动更新,在微软官网上下载。升级之后,
可以在 PowerShell 中输入 ``winver`` 命令来查看内部版本号。
- 「Windows 设置 > 更新和安全 > Windows 预览体验计划」处选择加入 “Dev 开发者模式”。
- 以管理员身份打开 PowerShell 终端并输入以下命令:
.. code-block::
# 启用 Windows 功能:“适用于 Linux 的 Windows 子系统”
>> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 启用 Windows 功能:“已安装的虚拟机平台”
>> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# <Distro> 改为对应从微软应用商店安装的 Linux 版本名,比如:`wsl --set-version Ubuntu 2`
# 如果你没有提前从微软应用商店安装任何 Linux 版本,请跳过此步骤
>> wsl --set-version <Distro> 2
# 设置默认为 WSL 2如果 Windows 版本不够,这条命令会出错
>> wsl --set-default-version 2
- `下载 Linux 内核安装包 <https://docs.microsoft.com/zh-cn/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package>`_
- 在微软商店Microsoft Store中搜索并安装 Ubuntu18.04 / 20.04。
C 开发环境配置
-------------------------------------------
这一大步和下面的Docker安装方式大家可以选用一种。
首先我们需要安装好RISC-V配套的gcc。首先选择一个位置放置gcc的可执行二进制文件。我们选择一个常用的位置。这个位置也可以大家自己指定。
.. code-block:: bash
cd /usr/local
之后直接下载预编译好的Risc-v工具链
.. code-block:: bash
sudo wget https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.08/riscv64-unknown-elf-gcc-10.1.0-2020.08.2-x86_64-linux-ubuntu14.tar.gz
解压缩:
.. code-block:: bash
tar xzvf riscv64-unknown-elf-gcc-10.1.0-2020.08.2-x86_64-linux-ubuntu14.tar.gz
文件名改短:
.. code-block:: bash
mv riscv64-unknown-elf-gcc-10.1.0-2020.08.2-x86_64-linux-ubuntu14 riscv64-unknown-elf-gcc
这里就算安装完成了。接下来我们要把gcc的二进制文件路径添加到PATH之中这样我们才能在任意目录直接运行它。将以下指令添加到home下的.bashrc之中可以一劳永逸地添加(如果你使用的是自己的路径请更换路径的前缀/usr/local到你自己的路径)
.. code-block:: bash
export PATH="/usr/local/riscv64-unknown-elf-gcc/bin:$PATH"
接下来继续安装用于交叉编译的musl-gcc,这里我们仍然使用/usr/local存放它。下面的步骤和上一步的安装是一样的
.. code-block:: bash
cd /usr/local
sudo wget https://more.musl.cc/9.2.1-20190831/x86_64-linux-musl/riscv64-linux-musl-cross.tgz
tar xzvf riscv64-linux-musl-cross.tgz
将路径添加到PATH之中:
.. code-block:: bash
export PATH="/usr/local/riscv64-linux-musl-cross/bin:$PATH"
我们的项目使用cmake搭建因此还需要安装cmake。
.. code-block:: bash
sudo apt install cmake
如果是第一次启动虚拟机,需要执行:
.. code-block:: bash
sudo apt update
sudo apt upgrade
至于 C 开发环境推荐直接使用Vscode作为IDE来进行。可以在其中安装C的插件来使用自动补全和lint。
Docker 环境安装(可选,已完成上述步骤的可以忽略)
----------------------------------------
使用配置好的Docker容器可以免于自己安装上面的一系列包当然会多出配置Docker的工作量。
- 首先安装Docker: https://www.docker.com/get-started
- 接着拉取我们的Docker镜像文件
.. code-block:: bash
docker pull nzpznk/oslab-c-env
docker pull registry.cn-hangzhou.aliyuncs.com/nzpznk/oslab-c-env
- 查看下载的镜像文件docker image ls (nzpznk/oslab-c-env or registry.cn-hangzhou.aliyuncs.com/nzpznk/oslab-c-env)
- 使用下载的镜像文件创建一个名字叫container_name(可自己指定)的容器并获得容器的bash shell: docker run -it --name container_name image_name /bin/bash
- 一些常用的指令:
.. code-block:: bash
# 检查运行中的容器
docker ps
# 检查所有容器(包括停止了的)
docker ps -a
# 停止 / 启动容器
docker stop/start container_name
# 获取一个运行中的docker容器的bash shell:
docker exec -it container_name /bin/bash
# 删除一个已经停止的容器:
docker rm container_name
- 之后就是把我们宿主机的文件挂载在docker容器上.在使用 docker run 启动容器时你可以将目录挂载到容器上这样就可以从docker容器访问到本地主机的某个文件夹.
.. code-block:: bash
docker run -it --name container_name --mount type=bind,src=[absolute path of folder in host machine],dst=[absolute path in container] image_name /bin/bas
Qemu 模拟器安装
----------------------------------------
这里的内容和rCore文档中的一致。我们需要使用 Qemu 5.0.0 版本进行实验,而很多 Linux 发行版的软件包管理器默认软件源中的 Qemu 版本过低,因此
我们需要从源码手动编译安装 Qemu 模拟器。
首先我们安装依赖包,获取 Qemu 源代码并手动编译:
.. code-block:: bash
# 安装编译所需的依赖包
sudo apt 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 pkg-config libglib2.0-dev libpixman-1-dev git tmux python3
# 下载源码包
# 如果下载速度过慢可以使用我们提供的百度网盘链接https://pan.baidu.com/s/1z-iWIPjxjxbdFS2Qf-NKxQ
# 提取码 8woe
wget https://download.qemu.org/qemu-5.0.0.tar.xz
# 解压
tar xvJf qemu-5.0.0.tar.xz
# 编译安装并配置 RISC-V 支持
cd qemu-5.0.0
./configure --target-list=riscv64-softmmu,riscv64-linux-user
make -j$(nproc)
.. note::
注意,上面的依赖包可能并不完全,比如在 Ubuntu 18.04 上:
- 出现 ``ERROR: pkg-config binary 'pkg-config' not found`` 时,可以安装 ``pkg-config`` 包;
- 出现 ``ERROR: glib-2.48 gthread-2.0 is required to compile QEMU`` 时,可以安装
``libglib2.0-dev`` 包;
- 出现 ``ERROR: pixman >= 0.21.8 not present`` 时,可以安装 ``libpixman-1-dev`` 包。
另外一些 Linux 发行版编译 Qemu 的依赖包可以从 `这里 <https://risc-v-getting-started-guide.readthedocs.io/en/latest/linux-qemu.html#prerequisites>`_
找到。
之后我们可以在同目录下 ``sudo make install`` 将 Qemu 安装到 ``/usr/local/bin`` 目录下,但这样经常会引起
冲突。个人来说更习惯的做法是,编辑 ``~/.bashrc`` 文件(如果使用的是默认的 ``bash`` 终端),在文件的末尾加入
几行:
.. code-block:: bash
# 请注意qemu-5.0.0 的父目录可以随着你的实际安装位置灵活调整
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-5.0.0
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-5.0.0/riscv64-softmmu
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-5.0.0/riscv64-linux-user
随后即可在当前终端 ``source ~/.bashrc`` 更新系统路径,或者直接重启一个新的终端。
此时我们可以确认 Qemu 的版本:
.. code-block:: bash
qemu-system-riscv64 --version
qemu-riscv64 --version
K210 真机串口通信
------------------------------
为了能在 K210 真机上运行 Tutorial我们还需要安装基于 Python 的串口通信库和简易的串口终端。
.. code-block:: bash
pip3 install pyserial
sudo apt install python-serial
GDB 调试支持
------------------------------
``os`` 目录下 ``make debug`` 可以调试我们的内核,这需要安装终端复用工具 ``tmux`` ,还需要基于 riscv64 平台的 gdb 调试器 ``riscv64-unknown-elf-gdb`` 。该调试器包含在 riscv64 gcc 工具链中,工具链的预编译版本可以在如下链接处下载:
- `Ubuntu 平台 <https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-linux-ubuntu14.tar.gz>`_
- `macOS 平台 <https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-apple-darwin.tar.gz>`_
- `Windows 平台 <https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-w64-mingw32.zip>`_
- `CentOS 平台 <https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-linux-centos6.tar.gz>`_
解压后在 ``bin`` 目录下即可找到 ``riscv64-unknown-elf-gdb`` 以及另外一些常用工具 ``objcopy/objdump/readelf`` 等。
运行 rCore-Tutorial-v3
------------------------------------------------------------
在 Qemu 平台上运行
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如果是在 Qemu 平台上运行,只需在 ``os`` 目录下 ``make run`` 即可。在内核加载完毕之后,可以看到目前可以用的
应用程序。 ``usertests`` 打包了其中的很大一部分,所以我们可以运行它,只需输入在终端中输入它的名字即可。
.. image:: qemu-final.gif
之后,可以先按下 ``Ctrl+A`` ,再按下 ``X`` 来退出 Qemu。
在 K210 平台上运行
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如果是在 K210 平台上运行则略显复杂。
首先,我们需要将 MicroSD 插入 PC 来将文件系统镜像拷贝上去。
.. image:: prepare-sd.gif
.. warning::
``os/Makefile`` 中我们默认设置 MicroSD 在当前操作系统中可以用设备 ``SDCARD=/dev/sdb`` 访问。你可以使用 ``df -hT`` 命令来确认在你的环境中 MicroSD 是哪个设备,
并在 ``make sdcard`` 之前对 ``os/Makefile````SDCARD`` 配置做出适当的修改。不然,这有可能导致 **设备 /dev/sdb 上数据丢失**
随后,我们将 MicroSD 插入 K210 开发板,将 K210 开发板连接到 PC ,然后进入 ``os`` 目录 ``make run BOARD=k210``
在 K210 开发板上跑 Tutorial 。
.. image:: k210-final.gif
之后,可以按下 ``Ctrl+]`` 来退出串口终端。
到这里恭喜你完成了实验环境的配置可以开始阅读教程的正文部分了可以直接clone下面的仓库来开始OS之旅
.. code-block:: bash
git clone https://github.com/DeathWish5/ucore-Tutorial.git