FS模拟和SE模拟最大的区别是:FS模拟会启动Linux操作系统,会模拟系统的所有组件。因此需要给系统配置相应的Linux内核以及磁盘镜像,镜像文件作为Linux系统的文件系统。在FS模拟下,使用gem5自带的python脚本configs/example/fs.py。读者在后面熟悉了模拟流程后,可以按照自己实验需求对其进行一定程度修改。
目录
今天才知道,原来在获取img文件和vmlinux文件时,gem5的官网给出了自动获取的脚本,在configs/example/gem5_library/x86-ubuntu-run.py中,指定了相应的版本
官网关于FS模式下运行X86的tutorial链接: gem5: X86 Full-System Tutorial
我试了一下是可行的,开启gem5之后,在相应的启动m5就可以进行操作系统级别的模拟了。2023-03-09 16:59更新.
比如:我的gem5版本是20.0.0.3,点击进入后,如下:选择tgz,开始下载
比如这次,我想要一个img镜像文件,选择gapbs,看它的readme就知道咋得到镜像文件了
制作方式如下:
按照上述步骤后即可得到,试了一下国内访问谷歌会超时……,直接点击prebuilt的下载tgz叭,照样用,还不用自己做 /(ㄒoㄒ)/~~
2024-03-25更新
一、关于img 文件和 vmlinux 文件
mkdir full_system_images
cd full_system_images
当完成Linux内核和镜像文件下载完成后,在gem5目录下创建full-system-image目录,该目录下创建binaries和disks两个子目录,其中binaries目录用于存放Linux内核文件(vmlinux二进制文件,包含Linux内核的代码和数据),disks目录用于存放镜像文件(.img,包含了一个系统的所有文件和数据)。
img 文件和 vmlinux 文件是 gem5 中启动操作系统所需的两个重要文件。
- 硬盘 img 文件储存了操作系统的文件系统和应用程序,这些文件是操作系统运行所必需的。操作系统需要文件系统来存储和组织文件,需要应用程序来实现特定功能。因此,如果没有 img 文件,操作系统就无法正常工作。
- vmlinux 文件储存了操作系统的内核代码。内核是操作系统的核心部分,负责管理系统资源和提供基本的服务。如果没有内核,操作系统就无法正常启动和运行。因此,vmlinux 文件也是操作系统启动所必需的。
因此,为了使 gem5 正常工作,需要同时使用 img 和 vmlinux 文件。这两个文件共同描述了 gem5 中要模拟的计算机系统,并提供了操作系统所需的文件和代码。
二、获取img 文件和 vmlinux 文件
关于FS模式的运行,我觉得难点主要是在自己制作img文件,官网有4种制作方法,如下:
- 使用 gem5 实用程序创建磁盘映像
- 使用 gem5 utils 和 chroot 创建磁盘映像
- 使用 QEMU 创建磁盘映像(本文使用的方法,可以两边结合起来看)
- 使用打包程序创建磁盘映像
2.1 img 文件可以直接下载
这个是我此次想要运行的开源代码给出的磁盘镜像,里面已经放好了测试程序
2.2 可以自行制作 img 文件
使用 qemu 创建
sudo apt install qemu-utils //先装包
qemu-img create ubuntu-test.img 8G
使用 parted 命令打开 ubuntu-test.img
镜像文件,开始创建新的分区表
sudo parted ubuntu-test.img
成功进入之后
mklable // 在 ubuntu-test.img 镜像文件中创建一个新的分区表
MSDOS // 使用 MS-DOS 分区表格式
quit // 退出 parted 命令
总的来说,这一段代码在为 ubuntu-test.img
镜像文件创建一个新的 MS-DOS 分区表。
安装 Ubuntu(注意下载的iso文件要服务器版本,desktop版本我没成功)
qemu-system-x86_64 -hda ./ubuntu-test.img -cdrom [要安装的 ubuntu 的 iso 安装文
件] -m 1024 -enable-kvm -boot d
就普通安装(不要最小化安装,反正我当时试过了没成功,正常安装一直continue就行,分区的时候选择默认系统安装的时候),但是在给磁盘分区时要注意以下问题:
- 不要有除了/分区以外的任何分区(至少 boot 分区和 swap 分区是不能有的,其余的
- 欢迎探索)。
- 根目录分区要选择 bootable。
- 不能有逻辑分区!
在安装Ubuntu的时候可以选择手动分区,在指定文件系统的时候常选的xfs和ext4是啥?
XFS 是一种高性能的文件系统,适用于存储大型文件,例如视频、音频和图像文件。XFS 主要用于 Linux 系统,支持大型卷(超过 8TB),并且支持并行 I/O(即多个应用程序可以同时写入或读取文件)。
ext4 是一种常用的文件系统,适用于存储小型文件,例如文本文件、代码文件和表格文件。ext4 主要用于 Linux 系统,支持大型卷(超过 16TB),并提供了一些高级功能,例如多块组、大文件支持和时间戳精度。
2.3 部署 img 文件
跑安装好的 Ubuntu,进去部署,亦是在此阶段把自己要跑的程序文件移入到该镜像文件。
qemu-system-x86_64 -hda ./ubuntu-test.img -m 1024 -enable-kvm
- qemu-system-x86_64:这是 QEMU 虚拟机的可执行文件的名称。它支持 x86_64 架构的虚拟化。
- -hda ./ubuntu-test.img:这个选项将磁盘文件 ubuntu-test.img 挂载到虚拟机的第一个硬盘(也就是硬盘 A)上。
- -m 1024:这个选项将 1024MB 的内存分配给虚拟机。
- -enable-kvm:这个选项启用 KVM,也就是 Linux 内核虚拟化支持,以提升虚拟机的性能。
- 这条命令会启动一个 QEMU 虚拟机,并将 ubuntu-test.img 磁盘文件作为虚拟机的硬盘,并分配 1024MB 的内存,使用 KVM 来提升虚拟机的性能。
Ubuntu 15 版本以上直接跑以下代码:
wget http://cs.wisc.edu/~powerjg/files/gem5-guest-tools-x86.tgz
tar xzvf gem5-guest-tools-x86.tgz
cd gem5-guest-tools/
sudo ./install
这段代码是用来安装 gem5 的 guest tools 的。
- 首先使用 wget 下载 gem5-guest-tools-x86.tgz 文件,这个文件包含了 gem5 的 guest tools。
- 然后使用 tar 命令将文件解压,解压后会得到一个名为 gem5-guest-tools 的目录。
- 进入 gem5-guest-tools 目录。
- 最后执行 install 脚本,这个脚本会在系统上安装 gem5 的 guest tools。
gem5 的 guest tools 是一组工具,用来支持 gem5 仿真的操作系统。它可以让 gem5 模拟器能够与操作系统交互,如向操作系统发送信号、向操作系统传送数据等。
Ubuntu 15 版本以下先跑上面的代码,肯定会报错的。报错之后再使用 Upstart 去启动
gem5.service,即 update-rc.d gem5.service enable
2.4 获取vmlinux 文件
vmlinux 文件可以下载:
https://drive.google.com/file/d/1JQ89qmqQU1_KG1zuA9yEwFJbG3mLo0x/view?usp=sharing
三、设置环境变量并运行
3.1 Gem5端的运行
export M5_PATH=/用户名/home/gem5/full-system-image
这种方式设置的环境变量仅在当前终端下生效,关闭当前终端后需要重新设置。因此修改~/.bashrc文件以添加该环境变量
vim ~/.bashrc
再打开的文件的最后一行添加上述export命令
修改后,保存退出,然后使用source命令使上述修改生效
source ~/.bashrc
然后使用下面命令进行全系统模拟:
build/X86/gem5.opt -d 保存结果目录 configs/example/fs.py --disk=镜像名.img --kernel=内核文件名 --num-cpus=2 --后面添加系统不同组件的配置
不知道有哪些可配置选项可以使用-h或--help查看。如果报错和M5_PATH环境变量相关错误,说明模拟系统找不到内核文件和镜像,可以在gem5/configs/common/SysPaths.py中修改一个值,找到该文件中call函数,再第50行前后,将下面语句:
except KeyError:
paths=['dist/m5/system', 'n/poolfs/z/dist/m5/system']
// 将paths列表中的第二个字符串修改为自己full-system-image目录,然后保存,重新启动模拟即可
3.2 m5端的运行
当上述启动系统的命令正常运行后,需要另开一个终端以连接所模拟系统。可以使用系统自带的telnet或者gem5中m5term工具。
telnet localhost 3456
// 3456表示用于连接模拟系统的端口号,再gem5模拟中,默认的起始端口号为3456,
// 当后续需要模拟多个系统,端口号需要每次增加1
更加推荐使用m5term工具,其稳定性更好
首先需要对该工具进行安装
(1)切换到util/term目录
cd util/term //默认在gem5目录下
(2)编译
make gcc -o mterm term.c
(3)安装
make install
sudo install -o root -m 555 m5term /usr/local/bin
安装完成后,即可使用m5term连接模拟系统 :
m5term localhost 3456
-
完成上述操作后,只需要等待系统启动即可。启动之后可以进入系统查看,和用户在本地上使用Linux没有本质区别,只是命令的响应会比较慢。
-
在启动系统后,使用m5 exit指令,会结束本次模拟,而使用m5 checkpoint指令后,会给当前系统状态创建一个checkpoint,可以将其理解为当前系统的一个快照,后面需要重新进入系统的时候,可以直接从checkpoint处恢复,而不用等待系统启动的漫长时间。后面对checkpoint进行更加详细介绍
四、修改镜像文件
在FS模拟中,系统启动之后,需要运行真实的benchmark以完成对系统的评测和性能分析。但是需要运行的benchmark都需要提前放在镜像文件中,等系统启动后才能开始运行benchmark。如果等系统启动后在对所需benchmark进行编译,非常慢,而且启动的系统并不能直接连网以下载所需的软件包或benchmark。
总之,我们需要在制作镜像文件的时候就将需要的benchmark放入镜像文件中,这样系统启动后就可以直接运行benchmark了。这也是为什么要在制作镜像文件之前先安装所需的软件包,下载所需的benchmark等原因。
另外,在制作镜像文件的时候,也需要注意挂载文件系统的问题,因为在FS模拟中,系统并不会读取真实的磁盘分区,而是会使用一个模拟的文件系统,所以在制作镜像文件的时候要注意挂载模拟的文件系统,而不是真实的磁盘分区。
这里给出一种移动文件进入img文件的方式:
4.1 首先在disk目录下新建mnt目录并挂载img
mkdir mnt
sudo mount -o loop,offset=1048576 ./XXX.img ./mnt
4.2 移动文件
sudo cp ./已编译的待执行程序.out ./mnt
4.3 断开挂载
sudo umount ./mnt
挂载是指将一个磁盘文件或者分区作为一个文件系统挂载到操作系统中,使得用户可以像访问本地磁盘一样访问这个文件系统。具体来说,将 img 文件挂载到操作系统的某个目录下,使得在这个目录下可以像访问普通文件一样访问 img 文件中的内容。
此外,磁盘文件是可以访问的,但是通常情况下,我们不能直接访问磁盘文件,因为磁盘文件中存储的是磁盘中物理存储空间的映像。我们需要通过挂载磁盘文件来访问磁盘中的内容。
五、关于checkpoint
checkpoint是指在使用gem5模拟实验时,创建一个模拟系统的快照,这样在之后可以快速恢复到这个快照,可以极大程度上避免等待系统启动的时间,从而节省启动系统的时间。gem5提供了脚本文件hack_back_ckpt.rcS来自动创建checkpoint,也可以通过手动在模拟系统启动后输入m5 checkpoint命令来创建checkpoint。一旦创建了checkpoint,gem5会在输出目录中增加一个cpt目录,该目录存储checkpoint相关信息。之后,可以使用checkpoint恢复模拟,跳过系统启动的时间。
在文件在configs/boot目录下:hack_back_ckpt.rcS。在给gem5传递脚本参数的时候,需要使用--script参数,该参数的值为所传脚本文件的路径,相对路径或绝对路径都可以。命令如下:
m5 restore cpt/checkpoint.cpt.gz // 恢复存储在cpt/checkpoint.cpt.gz的checkpoint。
在恢复checkpoint的时候,可以使用--redirect-stdout和--redirect-stderr参数,来将恢复后的系统的输出重定向到指定文件中。例如:
m5 restore --redirect-stdout=output.txt
--redirect-stderr=error.txt cpt/checkpoint.cpt.gz
这条命令会将恢复后的系统的标准输出和标准错误输出重定向到output.txt和error.txt文件中。
注意,在使用checkpoint的时候,可能会出现系统时间不准的情况。这是因为checkpoint中存储的是系统在checkpoint创建时的状态,包括系统时间。如果需要恢复后的系统时间准确,可以使用:
--reset-clock参数,在恢复checkpoint的时候重置系统时间
--mem-type,用于更新新启动的系统的内存类型
--mem-channels,用于更新新启动的系统的内存通道数,在上述例子中,内存通道数由1个切换到4个。
恢复过程中一般使用类似于如下的命令:
build/X86/gem5.opt -d 指定输出目录 configs/example/fs.py --num-cpus=2 其他配置参数 -r 1 --checkpoint-dir=checkpoint目录在指定的输出目录中 --restore-with-cpu=O3CPU --cpu-type=O3CPU
在上述命令中当要从checkpoint中恢复时,需要指定-r参数,后面的数字1表示从第一个checkpoint中恢复,若有多个checkpoint,会根据创建checkpoint的Tick进行排序,然后根据需要选择即可
--checkpoint-dir选项用于指定创建的checkpoint的路径,相对路径或者绝对路径都可以
--restore-with-cpu选项用于更新新启动的系统的CPU类型,在上述例子中,CPU类型由AtomicSimpleCPU切换到O3CPU,
--cpu-type再次指定CPU类型,也可以不加
参考链接:
微信公众平台 (qq.com)https://mp.weixin.qq.com/s/VoPI0jbAERg8VK98oVff4Q微信公众平台 (qq.com)
https://mp.weixin.qq.com/s/ru61jLFNQ503Z0XMR5NvaQ微信公众平台 (qq.com)
https://mp.weixin.qq.com/s/K8BIZb25BGVgwQG2knBhsg温故而知新,常看常新,初看时雾里看花,再看收获颇丰,概括性很强