gem5在建立一个简单例子的代码解析及一些问题的解答

        本文章是我学习如何建立一个简单的gem5脚本时对代码进行的注释,以及对一些所遇问题的解答。

        我是根据http://www.gem5.org/documentation/learning_gem5/part1/simple_config/进行学习的。

下图为体系结构的框图:

以下为simple.py的完整代码及注释:

#导入m5和SimObjects
import m5
from m5.objects import *

#创建要模拟的系统
system = System()
#设置系统时钟。1、建立时钟域,2、设置时钟频率,3、为时钟域指定电压域
system.clk_domain = SrcClockDomain()
system.clk_domain.clock = '1GHz'
system.clk_domain.voltage_domain = VoltageDomain()

#设置系统模拟内存(计时模式),设置内存范围
system.mem_mode = 'timing'
system.mem_ranges = [AddrRange('512MB')]

#创建CPU(基于时间),
system.cpu = TimingSimpleCPU()

#创建系统范围内存总线
system.membus = SystemXBar()

#将CPU上的缓存端口连接到内存总线上。由于没有建立缓存cache,所以将icache和dcache直接连接到menbus
system.cpu.icache_port = system.membus.cpu_side_ports
system.cpu.dcache_port = system.membus.cpu_side_ports

#连接CPU的其他端口以确保系统可以正常工作,例如I/O控制器。
system.cpu.createInterruptController()
#将系统的一个特殊端口连接到menbus,这个端口只允许系统读写内存。
system.system_port = system.membus.cpu_side_ports

#x86的特定要求,将PIO和中断端口连接到内存总线
if m5.defines.buildEnv['TARGET_ISA'] == "x86":
    system.cpu.interrupts[0].pio = system.membus.mem_side_ports
    system.cpu.interrupts[0].int_requestor = system.membus.cpu_side_ports
    system.cpu.interrupts[0].int_responder = system.membus.mem_side_ports

#创建一个内存控制器,并将其连接到内存总线。这里使用的是DDR3控制器,负责内存的范围。
system.mem_ctrl = MemCtrl()
system.mem_ctrl.port = system.membus.mem_side_ports
system.mem_ctrl.dram = DDR3_1600_8x8()
system.mem_ctrl.dram.range = system.mem_ranges[0]

#---------设置CPU执行的进程--------------------#
#这里使用syscall仿真模式
#1、设置可执行文件,2、创建进程,设置进程执行的可执行文件,
# 3、将进程设置为CPU的工作负载,4、在CPU上创建进程(或者说创建执行环境)
binary = 'tests/test-progs/hello/bin/x86/linux/hello'

#对于gem5 v21及更高版本,加入下面一行。
system.workload = SEWorkload.init_compatible(binary)

process = Process()
process.cmd = [binary]
system.cpu.workload = process
system.cpu.createThreads()

#---------实例化系统并执行-------------#
#创建根对象,并实例化模拟
root = Root(full_system = False,system = system)
m5.instantiate()

#开始模拟。这里的print不是语句而是作为一个函数被调用。
print("Beginning simulation")
exit_event = m5.simulate()

#模拟结束后对系统进行检测
print('Exiting @ tick {} because {}'
    .format(m5.curTick(),exit_event.getCause()))

测试:

build/X86/gem5.opt configs/simple.py 

输出结果:

Beginning simulation
info: Entering event queue @ 0.  Starting simulation...
Hello world!
Exiting @ tick 454646000 because exiting with last active thread context

在学习时遇到的问题:

问题1、

fatal: MemCtrl system.mem_ctrl is unconnected!
Memory Usage: 606776 KBytes

答:这是因为代码错误。原文章http://www.gem5.org/documentation/learning_gem5/part1/simple_config/中在创建内存控制器阶段连接内存总线时使用的代码为:

system.mem_ctrl.dram.port = system.membus.mem_side_ports

将该段代码改为:

system.mem_ctrl.port = system.membus.mem_side_ports

问题2、

info: Entering event queue @ 0.  Starting simulation...
gem5 has encountered a segmentation fault!

答:这也是代码有问题。原文章http://www.gem5.org/documentation/learning_gem5/part1/simple_config/中已进行了说明

#对于gem5 v21及更高版本,加入下面一行。
#system.workload = SEWorkload.init_compatible(binary)

只不过原文中这里的代码也进行了注释。

我使用的时候未注意gem5的版本信息,出现了这个错误。如果你和我使用的都是最新版本需要取消代码的注释,使其可以运行。

#对于gem5 v21及更高版本,加入下面一行。
system.workload = SEWorkload.init_compatible(binary)

 

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值