文章

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-gnug++-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 Binariesgem5 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 fileCreate Disk Image for gem5 — SimpleSSD 2.0.12 documentation

dist-gem5

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
本文由作者按照 CC BY 4.0 进行授权