GEM5 环境配置
VSCODE 环境配置
Python 环境
GEM 5 的 SimObject Python 定义都在 m5.objects
包下,但 python 文件组织却不是按照目录进行的,每个 SimObject 虽然都属于 m5.objects
包,但其对应的文件却各自位于对应 C++ 源代码目录下。GEM 5 本身使用了其他的技巧来使得这些分散的 python 文件都置于 m5.objects
包下方便使用(详见 src/SConscript
文件中的 SimObject
以及 src/python/importer.py
文件)。
为了使 vscode 的 pylance 能够正确识别所有的 SimObject 方便代码阅读,可以将这些文件通过软链接的方式置于 build/ARM/python/m5/objects
目录下。可以在 GEM 5 运行的 python 脚本(比如 config/learning_gem5/part1/simple.py
)中添加以下代码来生成创建软链接的脚本:
1
2
3
4
5
f = open('create_link.sh', 'w')
for key,val in sys.meta_path[0].modules.items():
if key.startswith('m5.objects'):
# 将 xx 改为对应的前缀长度
f.write("ln -s ../../../../../src/" + val[0][xx:] + " ./\n")
通过运行 ./build/ARM/gem5.opt simple.py
就可以生成对应的脚本。之后将该脚本在 build/ARM/python/m5/objects
目录下执行。注意生成的脚本中有一些 python 文件是在 build/ARM
文件夹下的所以使用 val[0][xx:]
截取会有问题,需要手动修改(几个 mem/ruby/protocol
下的 python 文件)。
之后还需要在 m5/objects/__init__.py
文件中加入对应的 from xx import *
来使这些 SimObject 能够通过 from m5.objects import *
导入。将上面 python 代码中的 f.write
一行变为:f.write("from " + key.split('.')[-1] + " import *\n")
来生成这些代码并将这些代码加入到 m5/objects/__init__.py
文件中。
最后在 vscode 的 pylance 配置中将 ./build/ARM/python
加入到 extraPaths
中:修改 .vscode/settings.json
文件,将其加入到 python.analysis.extraPaths
中。
C++ 环境
.vscode/c_cpp_properties.json
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"configurations": [
{
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/src",
"${workspaceFolder}/ext/pybind11/include",
"/usr/include/python3.10"
],
"defines": [
"TRACING_ON=1"
],
}
],
}
System Emulation (SE)
ARM Cross Compile
安装 gcc-aarch64-linux-gnu
和 g++-aarch64-linux-gnu
。在编译的时候需要使用 -static
编译成静态链接可执行文件。
Full System (FS)
m5term
在 FS 模式下可以使用 util/term/m5term
连接 GEM5 运行的内核。需要先进入 util/term
目录下运行 make
。之后使用 ./util/term/m5term 3456
连接 GEM5,输入 ~.
退出连接。
Example Command
可以在 gem5: Guest Binaries 和 gem5 resources 上下载对应的文件。教程见 gem5: Extending gem5 for ARM
1
2
3
4
5
6
./build/ARM/gem5.opt \
configs/example/arm/fs_bigLITTLE.py \
--caches \
--kernel=arm-fs-img/binaries/vmlinux.arm64 \
--disk=arm-fs-img/ubuntu-18.04-arm64-docker.img \
--bootloader=arm-fs-img/binaries/boot.arm64
Disk Image Mount/Umount
1
2
3
4
sudo losetup -f --partscan disk.img
losetup -l # get loop dev of disk.img
fdisk -l disk.img # get start sector and sector size
sudo mount -t auto -o loop,offset=$((<start_sec>*<sec_size>)) /dev/loopX /mnt/disk
1
2
sudo umount /mnt/disk
sudo losetup -d /dev/loopX
见 [SOLVED] how to mount . img file 和 Create Disk Image for gem5 — SimpleSSD 2.0.12 documentation
dist-gem5
dist-gem5 给的样例是 config/example/fs.py
配置脚本,然而使用这个会有问题,改成 config/example/arm/dist_bigLITTLE.py
就可以正常运行。见 [gem5-users] Re: ARM FS emulation with nic support。
dist-gem5 的 bash 脚本有一行在运行时发现有问题,把 SW_PORT=${ADDR[5]}
改成 SW_PORT=${ADDR[6]}
后可以正常运行。
默认运行 dist-gem5 脚本启动 gem5 时由于不是可交互状态所以 gem5 会把 socket/vnc 等 listener 关闭,导致无法使用 m5term
连接。通过指定 gem5 的 --listener-mode=on
命令行参数就可以避免这个行为。对应的代码在 src/python/m5/main.py
中。要注意这个参数是 gem5 的参数而不是指定的 gem5 配置 python 脚本的参数,所以该参数需要在指定 python 脚本前添加。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
export DIST_M5=/home/qyzhang/gem5
export M5_PATH=$DIST_M5/arm-fs-img
bash $DIST_M5/util/dist/gem5-dist.sh \
-n 4 \
-r $DIST_M5/rundir \
-c $DIST_M5/ckptdir \
-x $DIST_M5/build/ARM/gem5.opt \
-s $DIST_M5/configs/dist/sw.py \
-f $DIST_M5/configs/example/arm/dist_bigLITTLE.py \
--m5-args \
--listener-mode=on \
--fs-args \
--caches \
--disk=$M5_PATH/ubuntu-18.04-arm64-docker.img \
--kernel=$M5_PATH/binaries/vmlinux.arm64 \
--bootloader=$M5_PATH/binaries/boot.arm64 \
--cf-args \
--dist-sync-start=1000000000000t