1.在docker 中拉取Linux 镜像
在一个空文件夹中创建文件 Dockerfile 写入如下命令,拉取一个基础的docker 镜像
FROM daocloud.io/library/ubuntu:16.04
RUN apt-get update && apt-get upgrade -y
WORKDIR /home/labs #设置工作目录的路径
在终端中 进入Dockerfile 文件所在的文件夹 执行如下命令:
docker build -t os_lab:0.1 .
然后等待docker ubuntu16.04 的镜像被拉取到本地。
在终端中输入如下命令,检查当前镜像
docker images
正常情况下,镜像会出现在本地docker 中
2.下载gcc 编译toolchains
我们编译的目标平台是 Arm64架构的机器。 一般来说,咱们使用的计算机都是 intel x86架构,因此,需要下载一些 其他开发者制作好的交叉编译工具链。
这里给出 gcc 交叉编译工具链的
将压缩文件下载到本地 并使用如下命令进行解压:
tar xzf arm-linux-gcc-4.3.2.tgz
3. 下载qemu 模拟器源代码
我们编译出来的demo 操作系统代码 是要运行在 ARM 64 架构的平台上的,为了调试和实验的方便,使用模拟器 运行代码 是一个省时省力的选择。
下面给出 qemu 模拟器 源代码下载链接
之后我们需要对qemu 进行编译, 编译qemu 放在后面进行说明。
4. docker 下本地目录挂载
为了方便在本地编写代码,在docker 容器环境中运行 , 我们将在本地新建一个文件夹 labs ,并将步骤2 和步骤3中 下载好的 gcc编译工具 和 qemu 模拟器源代码 放到此文件夹中。
如下图所示:
打开终端输入如下命令 查看 docker 下的 Ubuntu 镜像ID
docker images
然后在labs 目录下 输入 pwd
pwd
接下来,输入如下命令 将本地的labs 目录 挂载到 docker Ubuntu 镜像产生的容器中。
docker run -it --name os_arm -v `pwd`:/home/ 7cd
- –name :给当前创建的容器起一个名字
- -it : 给当前容器创建一个终端,并进入交互模式
- -v : 目录挂载
- 7cd : 我的计算机上Ubuntu 镜像的ID 在您的机器上,要换成自己的 imageID
如果一切正常,此时我们应该会进入刚刚创建好的容器中。如下图所示:
5. 编译qemu 模拟器
在编译模拟器之前,我们需要先下载一些工具和相关的库依赖
在终端输入如下命令:
apt-get install make tree file
make 是用来执行Makefile 文件的
tree 可以方便查看之后编写代码的目录结构,以树形展示
file 可以查看一些文件的相关信息
下载完毕后,进入qemu-4.0.0 文件夹 执行 configure 文件 。命令如下:
./configure --target-list=aarch64-softmmu
不出意外的话,会报一些依赖错误,如下图所示:
因为我们的 Ubuntu 是一个精简版的镜像,缺少一些编译qemu 的相关依赖。
参考qemu 在github 上的一些issues 下的回答
https://github.com/Cisco-Talos/pyrebox/issues/41 给出如下依赖:
apt-get install build-essential zlib1g-dev /
pkg-config libglib2.0-dev /
binutils-dev libboost-all-dev /
autoconf libtool libssl-dev /
libpixman-1-dev libpython-dev /
python-pip python-capstone virtualenv
相关资源需要较长时间进行下载,需要耐心等待. 可能还需要多试几次。
下载完成后会有如下提示:
然后再次执行qemu-4.0.0文件夹中的 configure 文件
./configure --target-list=aarch64-softmmu
然后在当前文件夹中 执行make命令 进行编译
make
耐心等待一些时间,我们的qemu 模拟器就编译好了。 如下图所示:
至此,我们需要的编译工具和负责OS运行的模拟器 就都准备好了。下一篇文章,将讲解,如何从0开始,在控制台输出 “hello world” .
如有不足,欢迎指正交流