docker 环境下编译运行 gem5

本文详细介绍了如何在Docker环境下配置、编译和运行gem5,针对VMware中可能出现的编译错误提供了解决方案。通过创建自定义Ubuntu镜像,安装必要的依赖,然后下载并编译gem5源码,最终成功运行gem5。此方法不仅解决了虚拟机资源限制导致的编译问题,还提供了在有限的网络条件下构建docker镜像的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题提出

最近一段时间在学习 gem5,首先想编译运行一下,但是在自己的老笔电和实验室的祖传台式机(🤐)上安装虚拟机(Vmware, ubuntu 20.04)以及最新版本的 gem5 后,发现在编译的阶段就报错,出现了一些无法解释的错误,在编译的时候监视系统资源情况,初步可以判断是因为系统资源的问题,但是经过很多次尝试,几乎将宿主机(windows)的内存和计算资源都分配给了虚拟机,仍然在编译没多久后就罢工了,实际上这个问题可能并不只我出现,当然如果你的虚拟机足以编译运行 gem5,那么其实没有必要继续在 docker 环境下尝试了。

docker 环境下配置

在 google cloud 云平台的限时免费资源上尝试了一下编译 gem5,发现最新版本的 gem5 是可以进行编译的,所以问题应该是出现在我们自己的机器和虚拟机上,当然也可能是我们的虚拟机安装的包依赖出现了问题,在查看官方文档时,发现官方已经制作了可以编译运行 gem5 环境的 docker 镜像:

gem5 docker 镜像

但是这些镜像是放在 google 云平台上的,经过尝试,添加镜像站也无法顺利 pull 下来,所以只能尝试其它方法,所幸的是有 dockerfile 可以使用,下面是 20.04 版本的 ubuntu 环境,上面的链接中还有其它版本的:

FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt -y update
RUN apt -y upgrade
RUN apt -y install build-essential git m4 scons zlib1g zlib1g-dev \
    libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev \
    python3-dev python3-six python-is-python3 doxygen libboost-all-dev \
    libhdf5-serial-dev python3-pydot libpng-dev libelf-dev pkg-config pip \
    python3-venv
RUN pip install mypy

我们可以利用这个 dockerfile 来创建镜像,但是在实验中中途因为网络问题只 pull 下来 ubuntu 镜像,后面的 apt-install 没有完成,所以我们也可以不用 dockerfile,自己按照步骤来创建镜像即可。

下面的步骤是基于 windows 下 docker 环境的,如果你使用的是 linux 环境或者你还未安装 docker 环境,最好先去了解配置一下 docker 环境。

获得 ubuntu 20.04 镜像

首先 pull 获得 ubuntu 20.04 镜像

docker pull ubuntu:20.04 # 获取 ubuntu 镜像

挂载共享文件夹

这里创建了一个容器,共享了宿主机的文件夹(d 盘下的 d:/docker/shared_data 文件夹,对应 ubuntu 中是 /shared_data 文件夹),镜像名称是 ubuntu:20.04,就是刚刚 pull 下来的镜像,/bin/bash 指的是打开 ubuntu 的 shell 端。

docker run -it -v d:/docker/shared_data:/shared_data ubuntu:20.04 /bin/bash

安装依赖

完成后即进入到 ubuntu 环境中,进行相关依赖包的安装:

apt -y update
apt -y upgrade
apt -y install build-essential git m4 scons zlib1g zlib1g-dev \
    libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev \
    python3-dev python3-six python-is-python3 doxygen libboost-all-dev \
    libhdf5-serial-dev python3-pydot libpng-dev libelf-dev pkg-config pip \
    python3-venv
pip install mypy

下载 gem5

此时下载 gem5 即可:

git clone https://gem5.googlesource.com/public/gem5

网络不好的话,可以到 github 上下载:

git clone git://github.com/gem5/gem5.git

编译运行

此时就可以按照官方步骤进行编译了,这里以 X86 为例,由于 docker 的 linux 环境默认使用的处理器资源是宿主机的全部处理器资源,所以 -j 指定宿主机的处理器核心数 + 1 即可:

scons build/X86/gem5.opt -j 5

实验了以下,大概花了两个小时,速度应该因(机器)而异,最后可以看到结果,warning 可以不用管:

 尝试运行一个实例:

build/X86/gem5.opt configs/learning_gem5/part1/simple.py

得到结果,执行成功:

 

总结

本文介绍了在 docker 环境下配置、编译和运行 gem5 的方法,成功解决了 vmware 中 gem5 可能编译失败的问题。

### 如何在RISC-V架构的gem5模拟器中编译运行C语言程序 #### 静态编译C语言程序 为了使C语言程序能够在gem5模拟器中正常运行,必须对其进行静态编译。这是因为动态链接库可能无法被gem5加载或识别。以下是使用`gcc`进行静态编译的方法: ```bash gcc -o hello hello.c -static ``` 此命令会将源文件`hello.c`编译成可执行文件`hello`,并且所有的标准库都被嵌入到二进制文件中[^1]。 --- #### 测试程序的内容 假设我们有一个简单的C语言测试程序`test_m5ops.c`,它包含了用于控制gem5统计功能的API调用(如`m5_reset_stats`、`m5_dump_stats`和`m5_exit`)。该程序的主要目的是初始化仿真环境、打印迭代次数以及结束仿真的统计数据收集过程。完整的代码如下所示: ```c #include <stdio.h> #include <stdint.h> #include <unistd.h> // M5op头文件 #include "gem5/m5ops.h" int main() { printf("Starting simulation\n"); // 初始化统计信息重置 m5_reset_stats(0, 0); // 主循环逻辑 for (int i = 0; i < 10; i++) { printf("Iteration %d\n", i); } // 倾倒当前统计信息 m5_dump_stats(0, 0); // 结束仿真 m5_exit(0); return 0; } ``` 上述代码通过调用`m5_reset_stats`来清除之前的性能计数器数据,并通过`m5_dump_stats`保存最终的结果。最后,`m5_exit`函数强制终止仿真进程[^2]。 --- #### 安装必要的工具链 为了让编译后的程序能够兼容RISC-V架构下的gem5模拟器,需要先构建适合目标平台的交叉编译工具链。具体操作流程如下: 1. **克隆riscv-tools仓库** 使用Git获取官方维护的RISC-V开发工具集合: ```bash git clone https://github.com/riscv/riscv-tools.git cd riscv-tools ``` 2. **更新子模块** 下载所有必需的依赖项及其最新版本: ```bash git submodule update --init --recursive ``` 3. **设置安装路径** 将工具链的目标目录定义为环境变量`RISCV`,以便后续脚本能自动找到这些组件的位置: ```bash export RISCV=/path/to/install/riscv/toolchain ``` 4. **启动构建过程** 执行自动化脚本来完成整个工具链的配置与组装工作: ```bash ./build.sh ``` 以上步骤完成后即可获得一套支持RISC-V指令集体系结构的标准GNU工具组[^3]。 --- #### 编译gem5模拟器 接下来需针对特定硬件平台重新编译gem5本身以确保其具备处理RISC-V指令的能力。如果是在Docker容器内部作业,则先进入对应的工作区后再发起SCons任务: ```bash scons build/RISCV/gem5.opt -j $(nproc) ``` 这里指定的是优化级别较高的版本(`opt`)而非调试用途的全特性实现形式(`debug`);同时利用多线程加速整体进度(-j参数)[^4]。 另外,在正式开始之前还应确认主机操作系统已预装好若干基础软件包作为支撑条件之一: ```bash sudo apt install python-six sudo apt-get install libboost-all-dev ``` 这两条语句分别负责提供Python扩展接口以及Boost C++ Libraries的核心框架部分[^5]。 --- #### 启动SE模式下的gem5实例 当一切准备就绪之后就可以尝试实际运行先前创建好的应用程序了。基本语法如下所列: ```bash ./build/RISCV/gem5.opt configs/example/se.py --cmd=./hello ``` 其中`--cmd`选项指定了待测实体的具体位置。这样就能观察到由虚拟CPU逐条解释每一条机器码所产生的效果直至遇到退出信号为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值