本文章是我学习如何向一个简单的gem5脚本添加缓存时的代码和注释,可与https://blog.csdn.net/luzi0206/article/details/117629255?spm=1001.2014.3001.5501对照阅读。

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

下图为体系结构框图:

首先创建与添加的缓存的类,代码为caches.py:

#导入SimObject中caches的类。位于src/mem/Cache/Cache.py中。
from m5.objects import Cache#对BaseCache进行扩展,建立新的类:L1Cache(1级缓存)、L2Cache(2级缓存)。
class L1Cache(Cache):#对Cache进行扩展assoc = 2tag_latency = 2data_latency = 2response_latency = 2mshrs = 4tgts_per_mshr = 20#添加两个函数将缓存与CPU和总线连接def connectCPU(self,cpu):#连接至CPU。在后续子类L1ICache和L1DCache中,因为端口不同,需要单独定义。raise NotImplementedErrordef connectBus(self,bus):#连接至总线self.mem_side = bus.cpu_side_portsclass L2Cache(Cache):size = '256kB'assoc = 8tag_latency = 20data_latency = 20response_latency = 20mshrs = 20tgts_per_mshr = 12def connectCPUSideBus(self,bus):#连接至CPU端self.cpu_side = bus.mem_side_portsdef connectMemSideBus(self,bus):#连接至总线端self.mem_side = bus.cpu_side_ports#建立L1Cache的2个子类。
class L1ICache(L1Cache):size = '16kB'def connectCPU(self, cpu):#为指令缓存定义单独的ConnectCPU函数,self.cpu_side = cpu.icache_portclass L1DCache(L1Cache):size = '64kB'def connectCPU(self, cpu):#为数据缓存定义单独的ConnectCPU函数,self.cpu_side = cpu.dcache_port

然后创建gem5的脚本,代码为simple2.py:

#导入m5和SimObjects
import m5
from m5.objects import *
#导入编写的caches.py中的caches
from caches 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()
#创建L1Cache
system.cpu.icache = L1ICache()
system.cpu.dcache = L1DCache()
#将L1Cache连接至CPU端口,这里是通过L1ICache和L1DCache类中的函数实现的。
system.cpu.icache.connectCPU(system.cpu)
system.cpu.dcache.connectCPU(system.cpu)#创建系统范围内存总线
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#创建二级总线(不能直接将一级缓存连接到二级缓存),并连接一级缓存和二级缓存
system.l2bus = L2XBar()
system.cpu.icache.connectBus(system.l2bus)
system.cpu.dcache.connectBus(system.l2bus)#创建二级缓存,连接二级缓存到二级总线和内存总线
system.l2cache = L2Cache()
system.l2cache.connectCPUSideBus(system.l2bus)
system.l2cache.connectMemSideBus(system.membus)#连接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_portssystem.cpu.interrupts[0].int_requestor = system.membus.cpu_side_portssystem.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/simple2.py 

结果:

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

在连接时需要考虑端口的选择问题(原本的代码是

memobject1.master = memobject2.slave

这里将端口名改为mem_side_ports、cpu_side_ports)。依据的体系结构来进行选择的,例如L2bus连接L1DataCachel时,因为L1DataCachel相对于L2bus位于CPU侧,所以L1DataCache需要连接L2bus的cpu_side_ports端口,而L2bus相对于L1DataCachel位于menbus侧,所以L2bus需要连接L1DataCachel的的mem_side_ports端口,即CPU侧的mem_side_ports端口需要连接menbus侧的cpu_side_ports端口。

gem5——向简单脚本中添加缓存相关推荐

  1. (转)淘淘商城系列——在业务逻辑中添加缓存

    http://blog.csdn.net/yerenyuan_pku/article/details/72871268 上文我们一起学习了如何使用Spring容器来管理Redis单机版和集群版实现,本 ...

  2. 学习淘淘商城第三十四课(在业务逻辑中添加缓存)

    上节课我们一起学习了如何用Spring容器来管理Redis单机版和集群版实现.这节我们来学习下在业务中添加缓存. Redis添加缓存有两种方式,一种是set,另一种是hset,这两种方式的不同之处是h ...

  3. 在油猴脚本中添加css样式的方法

    由于项目要求,需要在系统页面注入dom元素,且对这些注入的元素在UI界面层有美观度要求,就避免不了要对其CSS样式优化. 通常在油猴脚本中添加CSS样式的方法如下: 一.引入外部css文件 // @r ...

  4. mysql怎样在bat脚本中添加日志_如何在windows下用bat脚本定时备份mysql

    作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 并不是所有MySQL都运行在Linux下,windows下也需要 ...

  5. linux脚本数字加,linux-在bash脚本中添加数字表示“未找到”

    我正在用Vim编辑器为操作系统基础知识类制作bash脚本,并且遇到一个极其简单但令人沮丧的错误,我无法将变量加在一起并将总和设置为另一个变量.我尝试了多种格式来完成此操作,但是它要么打印出每个值,要么 ...

  6. 在shell脚本中添加暂停,按任意键继续

    分析一个复杂脚本的时候,有时候需要加点暂停,分段来看,比较清晰 于是参考了一些实现, function get_char() {SAVEDSTTY=`stty -g`stty -echostty cb ...

  7. mysql jpa缓存,如何在Spring Data JPA CRUDRepository中添加缓存功能

    I want to add "Cacheable" annotation in findOne method, and evict the cache when delete or ...

  8. shell脚本中执行命令_如何在Shell脚本中执行命令?

    shell脚本中执行命令 Shell is a command-line interpreter that allows the user to interact with the system. I ...

  9. shell脚本for循环_了解Shell脚本中的for循环

    shell脚本for循环 Continuing on from our previous tutorials, let's understand the for loop in shell scrip ...

  10. 如何在linux编写perl脚本,关于linux:如何在perl脚本中插入awk命令?

    我想在脚本中添加此awk命令,但始终出现错误. 我已放入"",但仍然出现错误. system("awk -F"\t" '{ for ( i=1; i& ...

最新文章

  1. 2021 线性代数 第三章 习题课
  2. python numpy.array 与list类似,不同点:前者区分元素不用逗号,中间用空格,矩阵用[]代表行向量,两个行向量中间仍无逗号;  而list区分元素用逗号
  3. Java设计模式(七大原则和单例模式篇)
  4. php如何实现区分编辑,php实现编辑和保存文件的方法
  5. mysql 连接 分组_详解MySQL中的分组查询与连接查询语句
  6. CSS中z-index全解析
  7. Windows Security——获取Windows已经保存的WiFi网络密码
  8. dz论坛服务器技术支持,服务器更换 升级 dz论坛首页 dz其他页面打开为空白解决方法...
  9. java webservice wsimport 无法将名称 'soapenc:Array' 解析为 'type definition' 组件 时对应的解决方法...
  10. 计算机句法分析的研究现状,计算机理论论文融合语义和句型信息的中文句法分析方法研究与实现...
  11. javascript:控制一个元素高度始终等于浏览器高度
  12. Unity商店下载存储地址
  13. ubuntu14.04下deb文件安装mysql数据库
  14. arch模型 matlab,ARCH模型(arch模型干嘛的)
  15. 服务器报错 http error 503.the service is unavailable怎么解决
  16. 图灵机停机问题的不可判定性
  17. 【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
  18. 自从掌握了Google和百度的 16 个高级搜索技巧,我再也没有解决不了的 bug 了
  19. DXXcodeConsoleUnicodePlugin debug栏打印时自动把/ueo6转化成汉字
  20. 计算机组成原理——存储地址与边界对齐

热门文章

  1. 计算机windows7桌面管理,win7自带桌面整理,win7系统怎么改回自带桌面
  2. 【图像融合】基于matlab小波变换图像融合【含Matlab源码 392期】
  3. excel合并两列内容_一起来学习Excel表格两列合并一列的两种方法
  4. 智慧农业项目建设体系之精准饲喂系统及数据分析
  5. 巨潮网怎么下载年报_如何下载上市公司财务报表?
  6. html如何让英文自动换行,HTML如何让英文自动换行不断词
  7. CAML语法- Query写法
  8. java限时抢购_Java生鲜电商平台-生鲜电商限时抢购功能设计与代码实战(小程序/APP)...
  9. python处理excel格式变化,分类,归类,行变列
  10. JavaScript中的文档碎片