0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Gem5 Arm Fullsystem仿真

处理器与AI芯片 来源:处理器与AI芯片 2023-01-04 14:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

gem5 system emulation 模式,内部实现了对system call的模拟,使用了一段时间后,有一些发现:
  1. 如果使用spec2017 X86编译,那么会存在对intel比较新的指令不支持的问题;后来使用gcc march K6 m32来解决,即使用amd的k6 32bit编译,但是这也只是权宜之计 ;

  2. gem5的开发人员在邮件list中介绍intel对gem5的译码支持比较差,最开始gem5的x86也是基于amd的;

  3. 很多论文中使用了ARM架构,gem5的开发人员也和ARM合作比较紧密,所以gem5对arm架构的指令支持比较好;

  4. 即使使用上面的方法,se模式还是会遇到gem5没有模拟的system call函数的问题

  5. 同时还会遇到环境的问题,比如549.fotonik3d,需要手动将input输入的压缩文件OBJ.dat.xz手动解压之后才能运行。

因为上述的问题,在邮件list中可以看出gem5的开发人员比较倾向于使用full system模式,用他的话就是"works magically"。


X86 full system

如果是基于X86 Ubuntu系统模拟gem5 arch,制作disk image比较简单,可以git clone gem5 resource, 在spec2017文件夹下放入spec2017.iso,调用build.sh自动调用packer将spec2017装入ubuntu的disk image生成spec-2017。

 ./build/X86/gem5.fast 
 --outdir=./m5out/ 
configs/example/gem5_library/x86-spec-cpu2017-benchmarks.py
--image=path/spec-2017
--benchmark=505.mcf_r
--size=ref
--partition=1

这里需要强调的是,gem5中介绍了多次qemu-kvm, 但是qemu-kvm并不是在X86架构中生成disk image和真正运行gem5时必须的工具。

在gem5中引入它的主要作用就是在boot阶段使用qemu,在真实的cpu上运行boot 阶段,进行加速,实际上如果我们在云服务器上跑,如果没有qemu软件或者权限,只是使用atomic cpu跑boot也是比较快的。

就是不要被qemu迷惑,fullsystem gem5可以理解成在gem5上跑app,不过这个app是os,单纯的用atomic cpu跑也没有任何问题。


ARM full system

X86 full system的问题是memory最大支持3GB,目前看gem5的设置是不支持5GB 6GB这样的设置。

我们介绍一下如何生成gem5的disk image。

首先看一下最终成功运行full system 使用的指令:

./build/ARM/gem5.fast 
 -d./m5out/ARM/fullsystem64/spec2017 
./configs/example/fs.py
 --kernel2022/binaries/vmlinux.arm64
 --disk-imagepath/expanded-aarch64-ubuntu-trusty-headless.img
 --bootloader2022/binaries/boot.arm64--mem-type=DDR4_2400_4x16
 --param'system.highest_el_is_64=True'
 --script=./m5out/ARM/fullsystem64/spec2017_restore/spec2017.rcS

kernel 我的理解就是os内核程序,disk image则是装载了benchmark的磁盘镜像。

内核程序与我们无关,我们可以直接使用,disk image 则需要我们手动装载。

gem5官方提供的kernel和disk image

https://www.gem5.org/documentation/general_docs/fullsystem/guest_binaries

9b7fedbe-8bf4-11ed-bfe3-dac502259ad0.png

script这里指定的是一个script

#!/bin/bash
source/root/.bashrc
/sbin/m5checkpoint1
echo"Arealmultinodeworkloadmightstarthere..."
cd/home/gem5/spec2017
sourceshrc
echo"Resetstats"
/sbin/m5resetstats
runcpu--sizetest--iterations1--configmyconfig.aarch64.cfg--nobuild605.mcf_s
/sbin/m5exit1

通过指定这个script,gem5在boot成功后,运行这个script,就调用了脚本内的runcpu,自动运行了spec2017对应的app。

如果我们不指定这个script,并且不对disk image进行任何修改,那么boot成功后,要求输入用户名和密码,输入root可以进入,不过这个操作比较麻烦,还是建议指定script。


现在唯一需要的工作就是实现disk image,这里帮助对我很大的是这篇博客。https://www.eecg.utoronto.ca/~elsayed9/website/blog/gem5_fs_arm_flow.php

首先遇到的问题就是官方提供的image 1GB或者2GB,然而spec2017有4GB我们需要对image进行扩容。按照博客的操作如下

```bash
$#Backuptheoriginaldiskimageifneeded
$cpaarch64-ubuntu-trusty-headless.imgexpanded-aarch64-ubuntu-trusty-headless.img
$#Increasediskimageby2G
$ddif=/dev/zerobs=1Gcount=2>>expanded-aarch64-ubuntu-trusty-headless.img
$sudopartedexpanded-aarch64-ubuntu-trusty-headless.imgresizepart1100%
$#Parsesomeinfofor'losetup'and'mount'later
$name=$(sudofdisk-lexpanded-aarch64-ubuntu-trusty-headless.img|tail-1|awk-F:'{print$1}'|awk-F""'{print$1}')
$start_sector=$(sudofdisk-lexpanded-aarch64-ubuntu-trusty-headless.img|grep$name|awk-F""'{print$2}')
$units=$(sudofdisk-lexpanded-aarch64-ubuntu-trusty-headless.img|grepUnits|awk-F""'{print$8}')
$#Attachtodeviceandrecordoutput,tomeitwas/dev/loop18
$ sudo losetup -f --show expanded-aarch64-ubuntu-trusty-headless.img -o $(($start_sector*$units))                         
$sudoe2fsck-f/dev/loop18#Fixpotentialerrors,pressYforallfixes
$sudoresize2fs/dev/loop18#Actualresizingstep
$sudoe2fsck-f/dev/loop18#Doublechecktherearenoerror
$sudolosetup-d/dev/loop18#Detachfromtheloopdevice
$#Mountimageandchecknewsize
$mkdirdisk_mnt
$sudomount-oloop,offset=$(($start_sector*$units))expanded-aarch64-ubuntu-trusty-headless.imgdisk_mnt
$df-h#ShouldshowthenewexpandedimagesizewiththeUsedandAvailfordisk_mnt
$sudoumountdisk_mnt

扩容之后mount image,就可以安装spec2017到这个disk image了。

这里建议看一下 gem5-resources/src/spec-2017/disk-image/spec-2017/install-spec2017.sh 这个是装载spec2017到x86 os的过程,我们装载spec2017到arm,可以按照这个流程来。

gem5 resources的路径https://gem5.googlesource.com/public/gem5-resources
  1. sudo chroot . #将当前mount目录切换为主目录
  2. 创建/home/gem5/文件夹 将cpu_spec2017.iso拷贝到这个文件夹
  3. 按照cpu_spec2017.iso的install流程,mount cpu_spec2017.iso 然后install.sh
  4. install 之后,我们可以build,生成spec2017的可执行文件等。建议参考install-spec2017.sh
disk image中已经有gcc aarch64的编译工具,因此我们不需要额外再安装gcc aarch64,还是比较方便的。

我们将spec2017安装到了/home/gem5/,再结合一下刚才介绍的spec2017.rcS,就能看出来这个script的作用实际上就是进入文件夹,然后runcpu。

我们看一下gem5成功boot后运行spec2017的os系统界面,这个界面通过./util/term/m5term 得到,后面会介绍。

[  0.345190] sd 00 [sda] Attached SCSI disk
[  0.352995] EXT4-fs (sda1): mounted filesystem without journal. Opts: (null)
[  0.353004] VFS: Mounted root (ext4 filesystem) on device 8:1.
[  0.353626] devtmpfs: mounted
[  0.353684] Freeing unused kernel memory: 448K
[  0.359059] random: fast init done
Mount failed for selinuxfs on /sys/fs/selinux:  No such file or directory
[  0.372646] random: init: uninitialized urandom read (12 bytes read)
[  0.399519] random: mountall: uninitialized urandom read (12 bytes read)
Boot Success Reset stats
Run 602.gcc_s test
SPEC CPU(r) 2017 Benchmark Suites
Copyright1995-2017StandardPerformanceEvaluationCorporation(SPEC)
runcpu v5825
Using 'linux-aarch64' tools
Reading file manifests... read 32270 entries from 2 files in 0.44s (72680 files/s)
Loading runcpu modules.................
Locating benchmarks...found 47 benchmarks in 53 benchsets.
Reading config file '/home/gem5/spec2017/config/myconfig.aarch64.cfg'
1configurationselected:
 Action  Run Mode   Workload    Report Type    Benchmarks
--------   --------   --------   -----------------   --------------------------
validate   speed    test     SPECspeed2017_int   602.gcc_s               
-------------------------------------------------------------------------------
Settingupenvironmentforrunning
大约1Billion指令之后,大约半小时,完成boot。再执行3.5Billion的指令进入真实的runcpu仿真gem5仿真显示的界面:
**** REAL SIMULATION ****
build/ARM/dev/arm/rv_ctrl.cc:176: warn: SCReg: Access to unknown device dcc0pos0dev0
build/ARM/arch/arm/insts/pseudo.cc:172: warn:     instruction 'csdb' unimplemented
build/ARM/dev/arm/gic_v2.cc:683: warn: GIC APRn write ignored because not implemented: 0xd0
build/ARM/dev/arm/gic_v2.cc:683: warn: GIC APRn write ignored because not implemented: 0xd4
build/ARM/dev/arm/gic_v2.cc:683: warn: GIC APRn write ignored because not implemented: 0xd8
build/ARM/dev/arm/gic_v2.cc:683: warn: GIC APRn write ignored because not implemented: 0xdc
AtomicCPU 0 At 103419026000 Tid[0] 100000000 instructions are executed.
build/ARM/dev/arm/rv_ctrl.cc:122: warn: Tried to read RealView I/O at offset 0x60 that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:122: warn: Tried to read RealView I/O at offset 0x48 that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:198: warn: Tried to write RVIO at offset 0xa8 (data 0) that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:122: warn: Tried to read RealView I/O at offset 0x8 that doesn't exist
build/ARM/dev/arm/rv_ctrl.cc:122: warn: Tried to read RealView I/O at offset 0x48 that doesn't exist
build/ARM/dev/arm/energy_ctrl.cc:77: warn: EnergyCtrl: Disabled handler, ignoring read from reg 0
AtomicCPU 0 At 437185231000 Tid[0] 200000000 instructions are executed.
AtomicCPU 0 At 499727384000 Tid[0] 300000000 instructions are executed.
AtomicCPU 0 At 582010000000 Tid[0] 400000000 instructions are executed.
AtomicCPU 0 At 641077500000 Tid[0] 500000000 instructions are executed.
AtomicCPU 0 At 700009321500 Tid[0] 600000000 instructions are executed.
AtomicCPU 0 At 759169539000 Tid[0] 700000000 instructions are executed.
AtomicCPU 0 At 818393124500 Tid[0] 800000000 instructions are executed.
AtomicCPU 0 At 877446054000 Tid[0] 900000000 instructions are executed.
showInstNum AtomicCPU 0 At 907078901500 Tid[0] 950264835 instructions are executed.
Writing checkpoint
build/ARM/sim/simulate.cc:194: info: Entering event queue @ 907078901500.  Starting simulation...
AtomicCPU 0 At 936518571000 Tid[0] 1000000000 instructions are executed.
AtomicCPU 0 At 1019589630500 Tid[0] 100000000 instructions are executed.
AtomicCPU 0 At 1075531936500 Tid[0] 200000000 instructions are executed.
AtomicCPU 0 At 1133110363000 Tid[0] 300000000 instructions are executed.
AtomicCPU 0 At 1190919530500 Tid[0] 400000000 instructions are executed.
AtomicCPU 0 At 1248468781000 Tid[0] 500000000 instructions are executed.
AtomicCPU 0 At 1305429062000 Tid[0] 600000000 instructions are executed.
AtomicCPU 0 At 1363401303000 Tid[0] 700000000 instructions are executed.
AtomicCPU 0 At 1421469390000 Tid[0] 800000000 instructions are executed.
AtomicCPU 0 At 1479484997500 Tid[0] 900000000 instructions are executed.
AtomicCPU 0 At 1537414678500 Tid[0] 1000000000 instructions are executed.
AtomicCPU 0 At 1595390184500 Tid[0] 1100000000 instructions are executed.
AtomicCPU 0 At 1646996227500 Tid[0] 1200000000 instructions are executed.
AtomicCPU 0 At 1698272492000 Tid[0] 1300000000 instructions are executed.
AtomicCPU 0 At 1754533327500 Tid[0] 1400000000 instructions are executed.
AtomicCPU 0 At 1814630599500 Tid[0] 1500000000 instructions are executed.
AtomicCPU 0 At 1866048774500 Tid[0] 1600000000 instructions are executed.
AtomicCPU 0 At 1922046022000 Tid[0] 1700000000 instructions are executed.
AtomicCPU 0 At 1978814167500 Tid[0] 1800000000 instructions are executed.
AtomicCPU 0 At 2036107971000 Tid[0] 1900000000 instructions are executed.
AtomicCPU 0 At 2093257147500 Tid[0] 2000000000 instructions are executed.
AtomicCPU 0 At 2150632827000 Tid[0] 2100000000 instructions are executed.
AtomicCPU 0 At 2206964371500 Tid[0] 2200000000 instructions are executed.
AtomicCPU 0 At 2264055743500 Tid[0] 2300000000 instructions are executed.
AtomicCPU 0 At 2324544549000 Tid[0] 2400000000 instructions are executed.
AtomicCPU 0 At 2381492086000 Tid[0] 2500000000 instructions are executed.
AtomicCPU 0 At 2439386832000 Tid[0] 2600000000 instructions are executed.
AtomicCPU 0 At 2497622146000 Tid[0] 2700000000 instructions are executed.
AtomicCPU 0 At 2556071830000 Tid[0] 2800000000 instructions are executed.
AtomicCPU 0 At 2613942974500 Tid[0] 2900000000 instructions are executed.
AtomicCPU 0 At 2672323657000 Tid[0] 3000000000 instructions are executed.
AtomicCPU 0 At 2730096081000 Tid[0] 3100000000 instructions are executed.
AtomicCPU 0 At 2788185618000 Tid[0] 3200000000 instructions are executed.
AtomicCPU 0 At 2846567200000 Tid[0] 3300000000 instructions are executed.
AtomicCPU 0 At 2906211195500 Tid[0] 3400000000 instructions are executed.
AtomicCPU0At2965004517500Tid[0]3500000000instructionsareexecuted.
这里Atomic****CPUinstructionsareexecuted.是我自己增加的打,不必关注,主要为了显示各个阶段的指令数目
最后再介绍一下./util/term/m5term 3460。

在gem5开始运行后,会显示system.terminal listening for connections on port NUMBER.

9b8c5a36-8bf4-11ed-bfe3-dac502259ad0.png

这时我们另开一个terminal,输入./util/term/m5term NUMBER,即可观察到当前os具体运行到哪一步,而上面说的,如果不指定script,需要手动输入root也是在这里。

对我帮助很大的两篇博客:

https://www.eecg.utoronto.ca/~elsayed9/website/blog/gem5_fs_arm_flow.php

https://lucian.run/2021/10/03/gem5%20FS/

有小伙伴后台私信申请读博士的,有意向的小伙伴欢迎私信。


审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9588

    浏览量

    393664
  • 仿真
    +关注

    关注

    55

    文章

    4535

    浏览量

    138664
  • 架构
    +关注

    关注

    1

    文章

    537

    浏览量

    26644

原文标题:Gem5 Arm Fullsystem 仿真

文章出处:【微信号:处理器与AI芯片,微信公众号:处理器与AI芯片】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32 MCU用什么仿真器开发?

    理论上各主流IDE枚举的、支持ARM Cortex内核的所有硬件仿真器,比如:J-LINK,ULINK,DAP,ST-Link等,都可以仿真、下载CW32 MCU的应用代码。如果想实现量产或者离线下载应用代码,则必须配套支持CW
    发表于 11-12 06:01

    Microchip SAMA5D29:面向高性能车载与工业应用的超低功耗 Arm Cortex-A5 MPU

    Microchip Technology基于Arm® Cortex®-A5 CPU的车用SAMA5D29 MPU是高性能、低功耗嵌入式微处理器,运行频率高达500MHz。符合AEC-Q100 2级
    的头像 发表于 10-13 11:28 1076次阅读
    Microchip SAMA<b class='flag-5'>5</b>D29:面向高性能车载与工业应用的超低功耗 <b class='flag-5'>Arm</b> Cortex-A<b class='flag-5'>5</b> MPU

    Arm助力MediaTek天玑9500重塑旗舰体验

    Arm 合作伙伴产品上“芯”!近日,MediaTek 发布了天玑 9500 旗舰 5G 智能体 AI 芯片,该芯片基于启用 SME2 的全新 Arm C1 CPU 集群打造,并搭载 Arm
    的头像 发表于 10-10 11:28 1386次阅读

    AM2632-Q1汽车双核 Arm® Cortex-R5F® MCU技术手册

    ® Cortex-R5F® 内核。作为一种选择,Arm® R5F 子系统可以编程为在锁步或双核模式下运行,以实现多种功能安全配置。工业通信子系统 (PRU-ICSS) 支持集成工业以太网通信协议,例如
    的头像 发表于 10-10 10:14 1130次阅读
    AM2632-Q1汽车双核 <b class='flag-5'>Arm</b>® Cortex-R<b class='flag-5'>5</b>F® MCU技术手册

    AM2631单核 Arm® Cortex-R5F® MCU技术手册

    ® Cortex-R5F® 内核。作为一种选择,Arm® R5F 子系统可以编程为在锁步或双核模式下运行,以实现多种功能安全配置。工业通信子系统 (PRU-ICSS) 支持集成工业以太网通信协议,例如
    的头像 发表于 10-10 10:09 1428次阅读
    AM2631单核 <b class='flag-5'>Arm</b>® Cortex-R<b class='flag-5'>5</b>F® MCU技术手册

    AM263P2-Q1 汽车双核 Arm® Cortex-R5F® MCU技术手册

    ® Cortex-R5F® 内核。作为一种选择,Arm® R5F 子系统可以编程为以锁步或双核模式运行,以实现多种功能安全配置。工业通信子系统 (PRU-ICSS) 支持集成工业以太网通信协议,例如
    的头像 发表于 09-29 10:15 907次阅读
    AM263P2-Q1 汽车双核 <b class='flag-5'>Arm</b>® Cortex-R<b class='flag-5'>5</b>F® MCU技术手册

    请问如何在keil μVision 5上进行ARM编译器的代码优化?

    如何在keil μVision 5上进行ARM编译器的代码优化?
    发表于 08-20 07:37

    一文读懂 | SECS/GEM 通信基础及 GEM 控制状态模型

    的核心支柱。本文将为您介绍GEM标准,并开启一个由5篇文章组成的系列,阐述GEM的各项特性与优势。什么是GEM标准?GEM指一套规范制造设备
    的头像 发表于 08-19 13:46 4733次阅读
    一文读懂  |  SECS/<b class='flag-5'>GEM</b> 通信基础及 <b class='flag-5'>GEM</b> 控制状态模型

    一文了解Arm神经超级采样 (Arm Neural Super Sampling, Arm NSS) 深入探索架构、训练和推理

    本文将从训练、网络架构到后处理和推理等方面,深入探讨 Arm 神经超级采样 (Arm Neural Super Sampling, Arm NSS) 的工作原理,希望为机器学习 (ML) 工程师和移动端图形开发者来详细解释
    的头像 发表于 08-14 16:11 3267次阅读

    PCB仿真结果天下无敌,板厂加工让你一败涂地

    见过不少很会仿真高速过孔的高手,仿真结果very good,加工出来测试性能差5倍。你的仿真方法的确没什么问题,只是你选的PCB板厂配不上你而已……
    的头像 发表于 07-21 15:56 605次阅读
    PCB<b class='flag-5'>仿真</b>结果天下无敌,板厂加工让你一败涂地

    详解ADC电路的静态仿真和动态仿真

    ADC电路主要存在静态仿真和动态仿真两类仿真,针对两种不同的仿真,我们存在不同的输入信号和不同的数据采样,因此静态仿真和动态
    的头像 发表于 06-05 10:19 2300次阅读
    详解ADC电路的静态<b class='flag-5'>仿真</b>和动态<b class='flag-5'>仿真</b>

    Arm 公司面向 PC 市场的 ​Arm Niva​ 深度解读

    面向 PC 市场的 ​ Arm Niva ​ 深度解读 ​ Arm Niva ​ 是 Arm 公司为 PC 市场推出的核心计算平台,属于其“平台优先”战略的关键布局。作为 ​ Arm
    的头像 发表于 05-29 09:56 1880次阅读

    Arm 公司面向移动端市场的 ​Arm Lumex​ 深度解读

    面向移动端市场的 ​ Arm Lumex ​ 深度解读 ​ Arm Lumex ​ 是 Arm 公司面向移动设备市场推出的新一代计算平台,隶属于其“平台优先”战略的核心布局。作为 ​ Arm
    的头像 发表于 05-29 09:54 4564次阅读

    值得体验的多款Windows on Arm应用

    随着越来越多的开发者纷纷通过 Arm 原生支持的方式,打造更快速、更智能的应用体验,Windows on Arm 的发展势头和用户普及率持续加速升温。如今,普通 Windows 用户有超过 90
    的头像 发表于 05-28 13:56 2336次阅读

    《聊一聊ZXDoc》之CAN总线仿真、面板仿真

    ZXDoc支持CAN总线仿真、面板仿真功能,通过虚拟化通信环境,提前验证、优化和保障系统可靠性,降低开发成本与风险,面板仿真还使其画面实物化,便于操作和理解,仿真功能已成为ECU研发和
    的头像 发表于 05-09 11:30 1750次阅读
    《聊一聊ZXDoc》之CAN总线<b class='flag-5'>仿真</b>、面板<b class='flag-5'>仿真</b>