Gem5模拟器,FS模式运行自定义程序(九)

news2024/11/16 11:41:09

FS模拟和SE模拟最大的区别是:FS模拟会启动Linux操作系统,会模拟系统的所有组件。因此需要给系统配置相应的Linux内核以及磁盘镜像,镜像文件作为Linux系统的文件系统。在FS模拟下,使用gem5自带的python脚本configs/example/fs.py。读者在后面熟悉了模拟流程后,可以按照自己实验需求对其进行一定程度修改。


目录

一、关于img 文件和 vmlinux 文件

二、获取img 文件和 vmlinux 文件

2.1 img 文件可以直接下载

2.2 可以自行制作 img 文件

2.3 部署 img 文件

2.4 获取vmlinux 文件

三、设置环境变量并运行

3.1 Gem5端的运行

3.2 m5端的运行

四、修改镜像文件

4.1 首先在disk目录下新建mnt目录并挂载img

4.2 移动文件

4.3 断开挂载

五、关于checkpoint


一、关于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 创建磁盘映像(本文使用的方法,可以两边结合起来看)
  • 使用打包程序创建磁盘映像

gem5: Creating disk images 

2.1 img 文件可以直接下载

镜像文件以内存共享式CPU仿真器为例

这个是我此次想要运行的开源代码给出的磁盘镜像,里面已经放好了测试程序

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 的。

  1. 首先使用 wget 下载 gem5-guest-tools-x86.tgz 文件,这个文件包含了 gem5 的 guest tools。
  2. 然后使用 tar 命令将文件解压,解压后会得到一个名为 gem5-guest-tools 的目录。
  3. 进入 gem5-guest-tools 目录。
  4. 最后执行 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

也可以前往官方网站并在 Linux kernels 一行即可下载自己想要的 vmlinux 文件:
https://www.gem5.org/documentation/general_docs/gem5_resources/

 

三、设置环境变量并运行

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类型,也可以不加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从umati 看德国人如何玩OPCUA的

到目前为止,机器的联网标准缺乏统一的协议和语义标准。比较知名的要数每个的MTConnect。fanuc机床的focas协议。未来的发展方向是OPCUA协议。但是实现这个目标并非一日之功。德国的umati 社区也许给我们一些启发。 为了推进机床行业的数字化进程,VDW&…

从2022看2023年发展趋势

前言 时光荏苒,回望即将过去的2022年,前端领域在这一年中整体还是保持平稳向前,但对整个IT产业链路及互联网行业来说,变化还是很大的,下面我将简单分享一下个人对整个行业领域的一些观点与思考。鄙人才疏学浅&#xf…

Linux | 从头开始理解Linux以及工作日常常用命令

Linux的版本 分很多种,家庭用途版本有:Linux Mint、Ubuntu、OpenSUSE、Fedora、PC-BSD;商业用途版本有:Debian、RHEL、CentOS;还有其他版本:FreeBSD、OpenBSD、Solaris、OpenSolaris等。 目录 1.操作系统…

QT学习 控件(三)输入文本类与快捷键:QPlainText;QKeySequenceEdit

文章目录QPlainTextQKeySequenceEdit前情回顾: QLineEit QTextEdit文本输入类 QPlainTextEdit是一个简略版本的类,它的性能优于QTextEdit, 主要是因为在文本文档中使用QPlainTextDocumentLayout简化文本布局 QPlainText QPlainText和QTextEdit大致功能…

Dijkstra求最短路(堆优化)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。 请你求出 1 号点到 n 号点的最短距离,如果无法从1 号点走到 n 号点,则输出 −1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含三个整…

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《205.同构字符串、217. 存在重复元素、283. 移动零》。 目…

(十四)大白话磁盘文件中, 40个bit位的数据头以及真实数据是如何存储的?

文章目录 1、前情回顾2、详解40个bit位数据头1、前情回顾 之前我们已经给大家讲到了在磁盘上存储数据的时候, 每一行数据都会有变长字段长度列表,逆序存放这行数据里的变长字段的长度,然后会有NULL值列表,对于允许为NULL的字段都会有一个bit位标识那个字段是否为NULL,也是…

shell第五天作业——函数与数组

题目 一、编写函数,实现打印绿色OK和红色FAILED 二、编写函数,实现判断是否有位置参数,如无参数,提示错误 三、编写函数实现两个数字做为参数,返回最大值 四、编写函数,实现两个整数为参数,…

状态压缩DP——最短Hamilton路径

状态压缩DP——最短Hamilton路径一、题目描述二、思路分析1、状态转移方程(1)状态表示——状态压缩(2)状态转移2、循环和初始化(1)循环设计(2)初始化三、代码实现一、题目描述 二、思…

(day1)自学java基础

非原创,记录学习过程,为方便自己后期复习 目录 1.Java基础概念 2.运算符 3.判断 4.循环 5.循环高级 6.数组 7.数组的内存图 8.方法 ctrlaltL 自动格式化代码 为什么要配置环境变量? 我们想在任意目录都可以打开指定软件,就…

DDR3 数据传输(四)

目录 引言 AXI从侧接口参数 AXI从侧接口信号 参考说明 引言 前文链接&#x

巧用网络指数

哈喽,好久不见!今天我们来一起聊聊网络指数。网络指数平台是以网民在线使用行为数据为基础,借助关键词表达的重要信息检索渠道,一定程度上可以反映某一话题的关注度,也可以帮助我们抓住所谓的“热点”。这里&#xff0…

源码编译mindspore,利用云服务器与wsl

文章目录tmux的使用利用WSL2设置交换空间通过编译产生的output安装tmux的使用 参考:https://blog.csdn.net/weixin_43922901/article/details/89230499 参考:http://www.ruanyifeng.com/blog/2019/10/tmux.html tmux用于远程编译,开启一个会…

2023第一天,给你们展示一下用Python实现自动答题

前言 python实现自动答题? 别管,我这就给你们展示一下 (效果图看不了 不知道为什么说我违gui)😥 话不多说,咱就直接看代码吧 代码 准备模块 import requests import parsel from selenium import webd…

create-vite 源码解析它来喽

create-vite的源码很简单,只有一个文件,代码总行数400左右,但是实际需要阅读的代码大约只有200行左右,废话不多说,直接开始吧。 代码结构 create-vite的代码结构非常简单,直接将index.ts拉到最底下&#…

项目学习--谷粒商城

1. 微服务搭建 本地安装虚拟机,静态IP划分和docker的使用微服务功能模块介绍以及业务模块划分与抽取 2. 前端搭建 3. 后端业务代码完善 云储存OSS的整合与使用JSR303校验以及自定义分组校验 4. Elasticsearch学习 Elasticsearch的基础使用Elasticsearch字段ma…

volatile 详解

1. 前言 在并发编程的过程中,volatile属性非常重要。首先我们要了解并发编程的三大特性:可见性, 有序性, 原子性而我们今天的了解的volatile 就牵扯到可见性, 有序性。同时我也会从个人了解的角度给大家分析下,如果有什么不对的地方也希望大家…

物联网与射频识别技术,课程实验(一)

目录 (1)communication.py (2)Reader.py (3)Tag.py 实验1—— EPC C1G2标准下的标签状态转换仿真 实验说明: 利用Python或Matlab模拟C1G2标签的状态转换模型; 程序应能显示标签…

深度学习:01 神经网络与激活函数

目前,最广泛使用的定义是Kohonen于1988年的描述: 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应。 目录 对神经网络的概述 神经网络的表示 激活函数 为什么激…

2022年总结:从初二学生到算法作者的蜕变之路

目录 一年的创作历程 我和 CSDN 在编程竞赛的合作 About CBC 技术社区的发展 夜跑奇遇 About 博客之星 新年致谢 元旦祝福 一年的创作历程 2022年,这一年对于我来说是十分重要的一年。在这一年里,我作为一名初二在校学生,在CSDN上发布…