文章目录
在Ubuntu 22.04上安装gem5模拟器的详细教程
全过程大概两个小时
所以说gem5到底是什么???
Gem5是一款模块化的离散事件驱动全系统模拟器,它结合了M5和GEMS中最优秀的部分,M5提供了高度可配置的模拟框架,支持多种ISAs和CPU模型;GEMS补充了M5的特性,提供了详细而灵活的内存系统,包括多种cache 一致性协议和互连模型,是一款高度可配置、集成多种ISA,多种CPU模型的体系结构模拟器。
gem5模拟器目前支持多种ISAs,包括Alpha、ARM、MIPS、Power、SPARC和x86。模拟器的模块性允许这些不同的ISAs插入到通用CPU模型和内存系统中,而不需要为每一种ISAs设置一种专用的CPU模型和存储模型,这使得模拟器模块化程度较高且易于在不同CPU之间切换。
M5是由Michigan大学开发的一款开源的多处理机模拟器,受到了业内的广泛关注,很多高水平论文都采用M5作为研究工具。另一方面,Wisconsin推出的GEMS能够对储存层次进行详细而灵活的模拟,包括对多种不同的cache一致性协议和互联模型的支持。目前的GEM5是M5和GEMS的一个紧耦合版本。
简单来说:gem5是一款广泛使用的计算机体系结构模拟器,支持多种架构的仿真。我们的硬件实验课要用到,没了😎
在这篇教程中,我将向大家展示如何在Ubuntu 22.04上安装和配置gem5模拟器,包括X86和MIPS架构。教程的每一步我都会配有安装过程的终端的截图,供大家参考。
由于我也是第一次安装这个,有很多指令和程序都不太理解,需要解释的地方就直接问ChatGPT了。
本人的环境是Ubuntu 22.04,内存开的比较大,有100G,建议把内存开的大一些,不然后续安装的时候可能会因为内存不够而编译中断。
前提条件
在开始安装之前,确保你的系统已经更新到最新版本。你可以使用以下命令来更新系统:
sudo apt update
sudo apt upgrade
步骤1:安装必要的依赖项
首先,我们需要安装一些编译和运行gem5所需的依赖库。运行以下命令来安装这些依赖项:
sudo apt install -y build-essential python3 scons swig zlib1g-dev m4 \
libprotobuf-dev protobuf-compiler libgoogle-perftools-dev python3-six \
python3-dev pkg-config libpng-dev libdrm-dev libelf-dev
上面这些都是啥呢,我问了ChatGPT,它的回答如下
基本编译工具
- build-essential
- 描述:包含了一组基本的编译工具,例如
gcc
、g++
和make
等。- 作用:用于编译源代码,几乎是所有编译工作所需的基本工具包。
Python相关
- python3
- 描述:Python编程语言的第三个版本。
- 作用:gem5的构建和脚本执行需要Python。
- python3-dev
- 描述:Python开发工具包,包括头文件等开发相关文件。
- 作用:用于编译需要Python开发文件的程序和模块。
- python3-pip
- 描述:Python的包管理工具。
- 作用:用于安装和管理Python包,例如
protobuf
和six
。- python3-six
- 描述:一个帮助在Python 2和Python 3之间编写兼容代码的工具包。
- 作用:gem5依赖于该包来确保代码在不同Python版本中的兼容性。
构建工具
- scons
- 描述:一种软件构建工具,类似于
make
。- 作用:用于构建gem5,gem5的构建系统基于SCons。
- swig
- 描述:用于生成C/C++与其他编程语言(如Python)之间接口的工具。
- 作用:gem5使用SWIG生成Python接口。
压缩库- zlib1g-dev
- 描述:zlib库的开发文件
- 作用:提供压缩和解压缩功能,gem5中可能需要处理压缩数据。
编译工具
- m4
- 描述:一种宏处理器。
- 作用:在构建过程中处理宏。
序列化库
- libprotobuf-dev
- 描述:Protocol Buffers的开发库。
- 作用:用于数据序列化,gem5可能需要在模拟中使用序列化功能。
- protobuf-compiler
- 描述:Protocol Buffers的编译器。
- 作用:将.proto文件编译为源代码,供程序使用。
性能工具
- libgoogle-perftools-dev
- 描述:Google的性能分析工具的开发库。
- 作用:提供性能分析工具,用于检测和优化gem5的性能。
图像处理库
- libpng-dev
- 描述:PNG图像格式的开发库。
- 作用:处理PNG格式图像,可能用于生成模拟结果的图形表示。
图形相关库
- libdrm-dev
- 描述:Direct Rendering Manager(DRM)开发库。
- 作用:提供直接渲染的功能,可能用于图形模拟。
ELF文件处理
- libelf-dev
- 描述:用于处理ELF格式(可执行和链接格式)文件的库。
- 作用:读取和操作ELF文件,这对于模拟可执行文件时非常重要。
包管理工具
- pkg-config
- 描述:一个管理编译和链接标志的工具。
- 作用:用于查询已安装库的信息,帮助在编译过程中找到依赖库的正确路径和编译标志。
安装Python包
- pip3 install protobuf six
- 描述:
protobuf
是Protocol Buffers的Python实现,six
是一个兼容性库。- 作用:
protobuf
用于数据序列化和反序列化,six
帮助在Python 2和3之间写兼容代码。
…安装完是下面这样:
接下来,安装一些额外的Python包:
sudo apt install -y python3-pip
pip3 install protobuf six
- 安装Python包管理工具:
python3-pip
sudo apt install -y python3-pip
- 作用:安装
pip
,这是一个用来安装和管理Python包的工具。- 必要性:我们需要
pip
来安装gem5所需的Python库。- 安装必要的Python包:
protobuf
和six
pip3 install protobuf six
protobuf
:用于数据的序列化和反序列化,gem5需要它来处理复杂的数据结构。six
:提供兼容性支持,使代码可以在Python 2和Python 3之间无缝运行(尽管主要是为旧代码提供支持)。这两个命令确保你的系统有管理Python包的工具,并安装了gem5运行所需的关键库。
步骤2:克隆gem5源代码
使用git克隆gem5的源代码仓库。这里我们使用GitHub上的镜像仓库来避免网络问题:
git clone https://github.com/gem5/gem5.git
cd gem5
在执行这一步的时候,我最开始用的是Google的源代码仓库服务,使用git来克隆gem5的源代码仓库,如果你像我一样没有在Ubuntu装梯子的话就会看到以下报错:
所以我用了github的的镜像仓库。
步骤3:编译gem5
编译X86架构
极其重要!!!:在这个指令运行前请为你的Ubuntu分配足够多的空间。
根据需求编译X86架构的gem5。运行以下命令:
scons build/X86/gem5.opt -j$(nproc)
这里,-j$(nproc)
参数表示使用所有可用的CPU核心来加速编译过程。
这个指令用于编译gem5模拟器的X86架构版本:
解释:
scons
:一个开源的构建工具,用于自动化编译和构建软件,类似于make
。build/X86/gem5.opt
:指定构建目标,即编译生成的gem5可执行文件将位于build/X86
目录下,文件名为gem5.opt
。-j$(nproc)
:启用并行编译,$(nproc)
会动态获取当前系统的CPU核心数,从而加速编译过程。简单总结
这个指令使用scons
工具编译gem5的X86版本,生成的可执行文件位于build/X86/gem5.opt
,并且利用系统的所有CPU核心来加速编译过程。
回车后会有让你按enter和y这两步。
接下来的编译过程是比较漫长的等待…
你会看到很多向下面这样的:(目前,真的看不懂😂)
大概会持续40多分钟吧,我给虚拟机开了6个核,大家可以试试更多的😜,最后安装完了就是下面这样(warning应该没事吧…🤔)
编译MIPS架构
接下来,编译MIPS架构的gem5。运行以下命令:
scons build/MIPS/gem5.opt -j$(nproc)
这个跟上面的差不多,就不截图了。
好家伙两个指令集一共10个G,大家一定要给够内存。
步骤4:验证安装
验证X86架构
编译完成后,运行以下命令来验证X86架构的gem5是否成功安装:
build/X86/gem5.opt -h
然后,运行一个简单的测试程序:
这个测试程序可以在访达中找到
运行:
build/X86/gem5.opt configs/example/se.py -c tests/test-progs/hello/bin/x86/linux/hello
解释
build/X86/gem5.opt
:已经编译好的gem5模拟器的X86版本可执行文件。configs/example/se.py
:gem5的一个示例配置脚本,用于设置模拟的参数和环境。-c tests/test-progs/hello/bin/x86/linux/hello
:指定要运行的测试程序,这里是一个简单的“Hello world”程序。简单总结
这个指令运行gem5模拟器,使用一个示例配置脚本来设置模拟环境,并执行一个“Hello world”程序来测试模拟器是否正常工作。
也可以自己写一些脚本运行试试
我这里就写一个其他的最简单的脚本:
验证MIPS架构
同样,运行以下命令来验证MIPS架构的gem5是否成功安装:
build/MIPS/gem5.opt -h
然后,运行一个简单的测试程序:
build/MIPS/gem5.opt configs/example/se.py -c tests/test-progs/hello/bin/mips/linux/hello
常见问题
一下这些问题有一些实在Ubuntu20.04的配置和编译过程中遇到的,请大家酌情参考
脚本弃用警告
在运行某些配置脚本时,可能会遇到如下警告:
fatal: The 'configs/example/se.py' script has been deprecated. It can be found in 'configs/deprecated/example' if required. Its usage should be avoided as it will be removed in future releases of gem5.
这表示你使用的脚本已被弃用。你可以在configs/deprecated/example
目录中找到旧脚本,但建议使用新的配置脚本。例如:
build/X86/gem5.opt configs/example/se_simpler.py -c tests/test-progs/hello/bin/x86/linux/hello
虚拟机内存不够的变异终止
在使用 scons
编译项目时遇到了错误。链接器 (ld
) 被终止,错误码为信号 9,这通常表示系统内存不足(OOM,Out of Memory)。
这里有一些步骤可以帮助你排查并可能解决这个问题:
- 增加可用内存:如果你在内存有限的系统上编译,尝试增加可用内存。这可以通过关闭其他应用程序或者增加交换空间(swap space)来实现。
- 分部分编译:尝试分部分编译项目,而不是一次性编译所有内容。这可以更好地管理内存使用。
- 优化 scons 参数:你可以限制
scons
并行运行的作业数量,以减少内存消耗。使用-j
参数并跟上作业数量:scons -j 1
- 检查依赖库:错误信息中提到缺少一些头文件和库(如
capstone
,libpng
,HDF5
),虽然这些警告可能不是导致编译失败的主要原因,但安装这些依赖库可能会帮助解决问题:- 对于
capstone
:sudo apt-get install libcapstone-dev
- 对于
libpng
:sudo apt-get install libpng-dev
- 对于
HDF5
:sudo apt-get install libhdf5-dev
- 对于
- 检查 KVM 支持:如果需要 KVM 支持,请确保你的主机启用了 KVM 支持,并且安装了相关软件包。
在编译x86过程中出现了问题
g++: fatal error: Killed signal terminated program cc1plus compilation terminated. scons: *** [build/X86/arch/x86/generated/decoder.o] Error 1 ^Cscons: *** [build/X86/arch/x86/generated/inst-constrs.o] Build interrupted. scons: Build interrupted. scons: building terminated because of errors. scons: writing .sconsign file. “g++: fatal error: Killed signal terminated program cc1plus”
这个错误通常表示在编译过程中系统内存不足。这可能是因为要编译的代码太大或者系统没有足够的可用内存或交换空间来完成编译。
以下是一些解决这个问题的方法:
- 增加交换空间:如果系统的RAM不足,可以通过创建交换文件或增加现有交换分区的大小来增加交换空间。
创建交换文件的步骤如下:sudo fallocate -l 2G /swapfile # 创建一个2GB的交换文件 sudo chmod 600 /swapfile # 设置正确的权限 sudo mkswap /swapfile # 将文件设置为交换空间 sudo swapon /swapfile # 启用交换文件
- 减少并行编译线程数:如果你使用了多线程编译,尝试减少线程数。例如,如果你使用
scons -j4
,可以改为scons -j2
或scons -j1
。 - 优化代码:如果可能的话,尝试优化代码,减少内存占用。比如拆分大文件,减少模板的使用等。
- 检查系统资源:确保没有其他进程占用过多的内存。可以通过命令
top
或htop
查看系统资源使用情况。 - 编译选项:有时候调整编译选项也能减少内存占用。例如,可以尝试降低优化级别:
g++ -O1 ...
如果上述方法都不能解决问题,可能需要考虑在一台拥有更多内存的机器上进行编译。
{standard input}: Error: open CFI at the end of file; missing .cfi_endproc directive g++: fatal error: Killed signal terminated program cc1plus compilation terminated. scons: *** [build/X86/arch/x86/generated/inst-constrs.o] Error 1 scons: building terminated because of errors.
“{standard input}: Error: open CFI at the end of file; missing .cfi_endproc directive”
错误通常表示编译过程中生成的汇编代码中缺少.cfi_endproc
指令。这种情况可能是由于编译器生成的代码有问题或者是由于内存不足导致的。
结合之前的“g++: fatal error: Killed signal terminated program cc1plus”错误,这些错误很可能都是由于系统内存不足导致的。以下是解决方法的详细步骤:
增加交换空间
- 创建交换文件:
sudo fallocate -l 2G /swapfile # 创建一个2GB的交换文件 sudo chmod 600 /swapfile # 设置权限 sudo mkswap /swapfile # 将文件设置为交换空间 sudo swapon /swapfile # 启用交换文件
- 永久启用交换文件:
将以下行添加到/etc/fstab
文件中,以便在系统启动时自动启用交换文件:/swapfile none swap sw 0 0
减少并行编译线程数
减少并行编译的线程数可以降低内存压力。例如:
scons -j1
或者如果你使用make
:
make -j1
检查系统资源
检查当前系统资源使用情况,确保没有其他进程占用过多的内存:
top
或者:
htop
调整编译选项
尝试降低编译优化级别,这样可以减少内存使用:
g++ -O1 ...
清理项目和重试
有时编译错误可能是由于之前的编译过程未正确完成,尝试清理项目并重新编译:
scons -c # 清理项目
scons # 重新编译
或者如果你使用make
:
make clean # 清理项目
make # 重新编译
升级工具链
确保你的编译工具链(如GCC和scons)是最新版本,有时错误可能是由于工具链的bug导致的,升级到最新版本可能会解决问题。
总结
通过以上步骤,你应该能够在Ubuntu 22.04上成功安装和运行gem5模拟器,并支持X86和MIPS架构。如果在安装或运行过程中遇到任何问题,请检查错误信息并参考官方文档或社区支持。希望这篇教程对你有所帮助!