gem5使用模拟器里有bug吗,知道的列举一两个

linux操作(6)
在做计算机体系结构的时候,模拟器是一个重要且又有效的工具。其中gem5集成了gem和m5的优点,使用起来比较简单和方便。其中包括了se模式和fs模式,se模式是在gem5运行我们已经编译好的程序,可以获取cache,cpu状态等数据,fs模式下可以模拟操作系统,我们可以将我们自己修改的linux内核加载到哥们上运行。下面介绍了使用gem5的se模式,运行编译好的ARM可执行文件。获取访存的trace,然后我们可以通过这些trace模拟cache,并以此获取cache命中率等数据信息。
首先使用gem5运行已经编译好的可执行文件,以hello为例
build/ARM/gem5.opt configs/example/se.py -c hello
为了获取运行的trace,需要添加一些运行的参数
build/ARM/gem5.opt --outdir=memaccess --debug-flags=MemoryAccess --debug-file=memoryaccess.out configs/example/se.py -c hello
命令参数解析:
--outdir=memaccess 指明生成的 memory-access trace 文件所存放的文件夹。
--debug-flags=MemoryAccess 指 明 要 获 得 什 么 trace, 我 们 此 处 指 定 要 获 得MemoryAccess 的 trace(注意大小写,否则 gem5 会提示不识别这个 flag)
--debug-file=memoryaccess.out 指 明 trace 文 件 的 名 称 。 此 处 为memoryaccess.out
此处为MemoryAccess的trace,我们还可以获得 MMC 和 DRAM的trace
Memoryaccess.out :(此文件相对较大,打开比较慢)
分成两部分:
第一部分:0---------------------------------0,tick 不增。
此处显示的内容是把 hello 二进制程序“加载”到 gem5 的内存当中。
第二部分: 0--500--1000---------------------------end
0-500-1000,以 interval=500cycles 递增。此时就是实际程序逐条指令执行的过程。其中包括的信息和容易可以读懂。
在获取了该可执行文件的trace之后,也就知道了程序运行过程中具体的执行顺序,同时也知道了每一步具体执行的内存内容,包括IFetche读取指令,Write写数据,Read读数据等。
其中也包括了具体操作的物理地址。
下面就是cache模拟器的编写,我们使用4路组相连,blocksize默认大小为32Bytes,共4个组,下面是具体代码
#include&iostream&
#include&cstdlib&
#include&string.h&
#include&string&
#include&math.h&
#include&fstream&
typedef struct Cache
int blockS
cache_t **i_cache,**d_
string fileN
int i_num,wd_num,d_num,rd_num,i_hit,wd_hit,rd_
int stringToInt(string a)
int res = 0,now = 1;
for(int i=a.size()-1;i&=0;i--)
if(a[i]&='a')
res += (10+a[i]-'a')*
res += (a[i]-'0')*
now *= 16;
void simu_i_cache(int sets1,int a1,int blockSize1,string l1,string fileName1)
sets = sets1;
blockSize = blockSize1;
fileName = fileName1;
i_cache = new cache_t*[sets];
d_cache = new cache_t*[sets];
for(int i=0;i&i++)
i_cache[i] = new cache_t[a];
memset(i_cache[i],-1,a*sizeof(cache_t));
d_cache[i] = new cache_t[a];
memset(d_cache[i],-1,a*sizeof(cache_t));
int findSet(int addr)
int res = addr&&(int)(log(blockSize)/log(2));
int findIndex(int addr)
int res = addr&&(int)(log(blockSize)/log(2));
res = res&&(int)(log(sets)/log(2));
bool visitICache(int addr)
int mySet = findSet(addr);
int myIndex = findIndex(addr);
for(int i=0;i&a;i++)
if(i_cache[mySet][i].index == myIndex)
int maxTime=-1,insertIndex=-1,minTime = ;;
for(int i=0;i&a;i++)
if(minTime&i_cache[mySet][i].time)
minTime = i_cache[mySet][i].
insertIndex =
if(maxTime&i_cache[mySet][i].time)
maxTime = i_cache[mySet][i].
i_cache[mySet][insertIndex].index = myI
i_cache[mySet][insertIndex].time = maxTime+1;
bool visitDCache(int addr)
int mySet = findSet(addr);
int myIndex = findIndex(addr);
for(int i=0;i&a;i++)
if(d_cache[mySet][i].index == myIndex)
int maxTime=-1,insertIndex=-1,minTime = ;;
for(int i=0;i&a;i++)
if(minTime&d_cache[mySet][i].time)
minTime = d_cache[mySet][i].
insertIndex =
if(maxTime&d_cache[mySet][i].time)
maxTime = d_cache[mySet][i].
d_cache[mySet][insertIndex].index = myI
d_cache[mySet][insertIndex].time = maxTime+1;
void readFile()
ifstream fin(fileName.c_str());
while(fin && type && number)
int addr = stringToInt(number);
switch(type)
if(visitICache(addr))
if(visitDCache(addr))
if(visitDCache(addr))
cout && &error&&&
cout && &instruction hit ratio &&&(double)i_hit/i_num &&
cout && &write data hit ratio &&&(double)wd_hit/wd_num &&
cout && &read data hit ratio &&&(double)rd_hit/rd_num &&
int main()
simu_i_cache(4,8,32,&LRU&,&output.txt&);
readFile();
trace色输入文件是output.txt.即通过gem5模拟出来的trace。不过考虑到trace比较大,对trace做了预处理
output.txt实例
其中0代表代码读,1表示数据读,2表示数据写,后面是物理地址的16进制表示
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9554次
排名:千里之外
原创:47篇
(2)(2)(1)(2)(5)(12)(5)(5)(3)(13)(1)(1)& M5(GEM5)模拟器增加内存,解决Out of memory错误方法
M5(GEM5)模拟器增加内存,解决Out of memory错误方法
今天,我在M5用SE模式上跑程序时,出现了以下错误:
fatal: Out of memory, please increase size of physical memory.
后来去网上找了下,是默认的内存设置太小了,可以通过在configure的python脚本中改(如run.py),添加类似下面的一行
system.physmem.range = AddrRange("512MB")
本文作者: &&&&在新浪微博关注&&&&本博客
本博客采用进行许可,转载请保留作者和原文链接。
本文目前尚无任何 trackbacks 和 pingbacks.
- 441,460 views - 284,723 views - 130,376 views - 71,500 views - 37,235 views - 27,752 views - 25,730 views - 23,775 views
WP Cumulus Flash tag cloud by
requires Flash Player 9 or better.drastic模拟器玩口袋妖怪白,开完金手指出bug了,怎么办?金手指里有一项是标记精灵后精灵特性_百度知道
drastic模拟器玩口袋妖怪白,开完金手指出bug了,怎么办?金手指里有一项是标记精灵后精灵特性
hiphotos.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http,怎么办,我把巨钳螳螂特性改成了技师drastic模拟器玩口袋妖怪白.com/zhidao/pic/item/8c3fe736d12f2e9539。<a href="http://a.jpg" esrc="http://a?可以关上吗.baidu,开完金手指出bug了?金手指里有一项是标记精灵后精灵特性变更,怎么办.com/zhidao/wh%3D450%2C600/sign=/zhidao/wh%3D600%2C800/sign=09c93d07a706f1af0dd4e4/8c3fe736d12f2e9539.hiphotos.baidu.hiphotos?我清除所以金手指后重启也不行.baidu://a,关上后再标记其他的精灵也会变成技师
提问者采纳
存档留着用新的rom打开,你可以试着换一个rom再玩,但是你这情况说明那些特性已经固定在你的存档里了金手指改的是游戏rom内容
意思就是要用其他模拟器才行吗?
不是,跟模拟器没关系,你把你的rom删掉再重新下个就好了,存档跟模拟器都不要动
已经好了,我在模拟器的文件夹里把修改记录删了,谢谢你
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
来自团队:
其他类似问题
为您推荐:
口袋妖怪白的相关知识
其他1条回答
估计改不了。重新玩吧
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁解决gem5/M5模拟器“kernel too old”错误
编译安装了gem5 ARM架构的模拟器,运行使用arm-linux-gcc-4.4.3交叉编译链编译的文件时,出现了如下错误:
**** REAL SIMULATION ****
info: Entering event queue @ 0.& Starting simulation...
FATAL: kernel too old
panic: Page table fault when accessing virtual address 0x18
&@ cycle 351000
[invoke:build/ARM/sim/faults.cc, line 70]
Memory Usage: 624444 KBytes
Program aborted at cycle 351000
Aborted (core dumped)
在搜索一些资料之后,原因和解决方法如下:
出现&kernel too old& 的原因是不同版本的glibc库文件要依赖于不同版本的linux内核版本,并且编译器会限定运行该可执行文件所需的最低的内核版本。在编译时使用的编译器的版本比较高,它所指定的最低linux内核版本要高于m5声明的内核版本。
所以有两种解决方案。
第一种,调高m5声明的kernel版本
找到源文件:
src/arch/arm/linux/process.cc:& //不同架构请修改对应的arch
如下代码段:67-71行
strcpy(name-&sysname, &Linux&);
strcpy(name-&nodename, &m5.eecs.umich.edu&);
strcpy(name-&release, &x.x.xx&);
strcpy(name-&version, &#1 Mon Aug 18 11:32:15 EDT 2003&);
strcpy(name-&machine, &armv7l&);
修改 strcpy(name-&release, &x.x.xx&) -----&strcpy(name-&release, &2.6.35&);
我的arm-linux-gcc版本是4.4.3,将上述代码修改为 &2.6.35&。如有需要,请查找内核版本号历史,修改更高一点。
保存,重新编译m5,即可成功运行。
第二种,使用较低版本的arm-linux-gcc
我没有测试第二种,应该是可以的,只要将arm-linux-gcc的版本将下来,对内核版本的要求自然就低了。
------分隔线----------------------------Ubuntu12.04安装gem5/M5模拟器
最近需要做系统结构的模拟实验,今天在Ubuntu 12.04 上面成功安装 gem5 ,记录分享安装过程如下:
必要文件:
gem5:到http://www.m5sim.org/Download下载stable版本源代码包。
g++: 使用g++ 4.5版本,不要使用4.6,否则会出现编译无法通过!
可以通过命令:
[sudo apt-get install g++-4.5
sudo rm /usr/bin/g++
sudo ln -s /usr/bin/g++-4.5 /usr/bin/g++]
python:版本2.4或更高[一般系统自带]
SCons:版本0.98.1或更高。 ***注:我使用的是scons-local包。***
http://sourceforge.net/projects/scons/files/
SWIG:版本1.3.34。***注意:不要太高的版本,否则需要Perl支持。***
http://www.swig.org/
zlib:最近的版本。
http://www.zlib.net/
m4:宏处理器。
http://www.gnu.org/software/m4/
官方说明,参见:http://www.m5sim.org/Compiling_M5
假设将这些下载的文件放在用户主目录 gem5 下面。
编译gem5之前必须先安装这些必要的文件包。每个包里都有一个install文件说明了安装了方法,基本就是三部曲。
具体的安装过程如下:[具体情况,文件包名字略有不同]
解压gem5源文件:
bzip2 -d gem5-stable-1.tar.bz2
假设将gem5解压后的文件夹重命名为:gem5-stable
安装zlib:
解压下载的压缩包:
tar -xzvf zlib-1.2.7.tar.gz
进入解压之后的文件夹 zlib-1.2.7
cd zlib-1.2.7
执行命令:
./configure
sudo make install
安装SWIG:(注意版本!)
解压下载的压缩包:
tar -xzvf swig-1.3.34.tar.gz
进入解压后的文件夹:
cd swig-1.3.34
执行命令:
./configure
sudo make install
解压下载的压缩包:
tar -xzvf m4-latest.tar.gz
进入解压之后的文件夹 m4-1.4.16
cd m4-1.4.16
执行命令:
./configure
sudo make install
安装scons:
Scons的安装很简单,只需要将scons-local-2.2.0.tar.gz解压
tar -xzvf scons-local-2.2.0.tar.gz
将解压后的文件全部拷贝到gem5-stable中
进入gem5-stable文件夹:
cd gem5-stable
python scons.py build/&arch&/m5.&binary&
指定编译的选项,及目标文件,例如:
python scons.py build/ALPHA/m5.opt
如果出现如下错误:
错误:can&#39;t find Python.h header in [&#39;/usr/include/python2.7&#39;]
解决:sudo apt-get install python-dev
重新执行命令,没有错误则说明编译成功。
se模式下执行hello测试程序。
执行命令:
build/ARM/m5.opt configs/example/se.py -c tests/test-progs/hello/bin/arm/linux/hello
部分输出:
**** REAL SIMULATION ****
info: Entering event queue @ 0.& Starting simulation...
Hello world!
到此,安装测试成功!
------分隔线----------------------------}

我要回帖

更多关于 逆战bug禁模拟器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信