IMZHWK'S BLOG
imzhwk
Apr 29, 2019

若要使用 GXEMUL 模拟器运行 HOS ,总体上需要以下步骤:

  1. 编译并安装 GXEMUL
  2. 编译 HOS
  3. 使用模拟器运行 HOS

以下说明中,需要注意:

  • 代码区域内,是你在终端中需要执行的命令。
  • 代码区域内,每行的 # 字符及其后面的字符均为注释。

1. GXEMUL 的编译和安装

GXEMUL 是一款简单的模拟器,已经实现的模拟处理器包括 ARM/MIPS/Motorola 88K/PowerPC/SuperH 等多种架构。

为了运行 HOS ,我们不能简单地使用原版的 GXEMUL 。其原因在于 GXEMUL 预设的处理器参数与 HOS 预置在代码中的处理器参数不同。因此,我们需要修改 GXEMUL 的代码以匹配 HOS。

修改工作已经完成,修改后的代码可以在 这里 找到。GXEMUL 本身的依赖相当少,即使是新安装的 Linux 系统也可以简单地完成编译。

1.1 准备工作

Ubuntu/Other Linux

你需要确保你的机器可以编译 C++ 程序。

对于 Ubuntu 用户来说,只要你使用的不是五年前的版本,那么你可以跳过这一节了。

如果上面的断言不成立,那么请更新你的系统(因为它应该已经被正式停止支持了!)。

对于非 Ubuntu 用户来说,你应该自己寻找解决问题的办法。

Cygwin

同样,你需要确保你的环境可以编译 C++ 程序。这是最小的依赖,但是为了保证接下来的步骤不出问题,你需要:

在安装 Cygwin 时,或在之后打开它的安装程序,安装以下分类中的所有包:

  • Base
  • Devel
  • Python
  • Perl

具体来说,你需要点击安装界面左上的下拉栏,选择 Category ,然后展开列表,找到这些分类,将它们右边的 Default 改为 Install,然后继续。

全部安装下来相当耗时,但是这些包的安装将排除几乎所有可能的依赖问题。

1.2 下载代码

你可以使用 git clone 直接获得代码。

首先选择一个你觉得舒适的位置,然后

git clone https://github.com/klx3300/gxemul-hos.git

或者,你也可以直接在 GitHub 页面上选择 Download ZIP 下载压缩包。如果你如此做,那么:

首先将压缩包移动到一个你觉得舒适的位置,然后

mkdir gxemul-hos # 创建源码文件夹
unzip gxemul-hos-master.zip -d gxemul-hos # gxemul-hos-master.zip 应替换为你下载的压缩文件名

这样,代码的下载就完成了。

1.3 编译和安装

首先,你需要准备一个安装文件夹。GXEMUL 的可执行文件将在安装之后放置在那个文件夹中。

你可以:

  1. 在任何你觉得舒适的地方创建一个安装文件夹。若如此做,则假设 /path/to/your/install/folder 是你的安装文件夹路径。以下命令中的这串字符应当替换为你的安装文件夹的 绝对路径
  2. 使用系统安装文件夹(/usr)。若如此做,将以下命令中的 /path/to/your/install/folder 替换为 /usr

强烈不建议 使用系统安装文件夹。除非你知道你在干什么!

强烈不建议 使用系统安装文件夹。除非你知道你在干什么!

强烈不建议 使用系统安装文件夹。除非你知道你在干什么!

创建或选择完毕你的安装文件夹后,你需要:

export MY_INSTALL_FOLDER=/path/to/your/install/folder # 设置别名 ...(1)
cd gxemul-hos # 进入源码文件夹
env PREFIX=$MY_INSTALL_FOLDER ./configure # 执行 autoconf 自动配置脚本
# < autoconf 的输出 >
make # 编译

make 结束后,如果你选择的是创建自己的安装文件夹,那么

make install # 将可执行文件和 man 安装到安装文件夹
export PATH=$PATH:$MY_INSTALL_FOLDER/bin # 设置 PATH ...(2)
export MANPATH=$MANPATH:$MY_INSTALL_FOLDER/man # 设置 MANPATH ...(3)
# 命令 (1) (2) (3) 必须在重启/开启新的终端后重新执行一遍
# 另外一个方法是将这三条指令保存为 shell 脚本,具体方法请自行搜索网络

如果你选择的是系统安装文件夹,那么你只需要

sudo make install

就可以了。

此时,在终端中输入

gxemul -H

以检查安装是否正确。

2. HOS 的编译

首先,你需要一个可以工作的 MIPS Compiler 。我个人建议使用实验手册中提供的编译器,或者,在 这里 选择 MTI Bare Metal Toolchain 。编译器的安装过程 超出本文档范围 ,如果你不知道如何做,请按照实验手册完成编译器的安装。

接下来,你需要一份 HOS 的源码。

获得 HOS 源码很简单,你需要在一个你觉得舒适的位置执行:

git clone https://github.com/MrShawCode/hos-mips.git
cd hos-mips
git checkout gxemul # 切换到 gxemul 分支

最后,参照实验手册上的内容编译内核。如果你使用的是 MTI Bare Metal Toolchain ,并正确设置环境变量,那么你的编译命令应当是:

env CROSS_COMPILE=mips-mti-elf- make

3. 使用模拟器运行 HOS

这一步是最简单的,因为你只需要

./gxemul_run.sh

接下来你应该可以看到 HOS 在你的终端窗口中运行了。要进入模拟器自带的调试模式,按下组合键 Ctrl+C 。如果你要退出模拟器,在模拟器的调试模式下输入 quit 后回车。若要使用调试模式的其他高级功能,在调试模式下输入 help

4. 使用模拟器进行编码

首先,在去除 kern-ucore/Makefile.build 文件中的 TARGET_CFLAGS += -DBUILD_GXEMUL -DK_DEBUG 这一行后,这个分支构建的结果应当和主分支是一致的(也就是说,可以直接在板子上运行!)。

但是如果你需要开发能够合并到主分支的代码,就稍微有点麻烦:

其中一种方式是创建两个文件夹,其中一个按照第 2 部分的步骤设置到 gxemul 分支,另外一个则在 git clone 后就不执行其他操作,以保持在主分支。接下来,只需要在 gxemul 分支进行开发,然后手动将代码移动到主分支就可以了。

如果你不了解 Git 版本控制系统,那么我强烈推荐你直接这样工作。

否则,你可能会遇到更多问题。

如果你想学习 Git 版本控制系统,这里有一篇比较好的中文教程。

或者按照以下步骤:

在开发前,你需要进入主分支:

git reset --hard HEAD # 放弃 gxemul 分支上的所有改动
git checkout master

然后,在主分支完成你的编码工作。

编码工作完成后,你需要在主分支创建一个提交记录:

make clean
git add .
git commit -m "anything" # anything 可以替换为任何字符串

接下来,切换到 gxemul 分支,并合并主分支的所有更改:

git checkout gxemul
git merge master

最后一条指令 git merge master 可能会引发问题。你需要手动解决这些问题。

现在,你可以继续在 gxemul 分支运行模拟器了。