在simplescalar中添加基于PISA架构的指令
用sim-safe工具进行模拟。最近看代码的一点点心得记录一下。
sim-safe工具:不检查所有指令错误,检查内存对齐和所有内存操作的内存访问权限
程序从main.c的main()函数中进入
int main(int argc, char **argv, char **envp);
参数argc表示终端命令中字符串个数,argv表示要解析的命令字符串,envp为 XDG_VTNR=7?
opt_process_options(sim_odb, argc, argv); 解析输入参数命令;
banner(stderr, argc, argv); 输出模拟工具系统信息;
md_init_decoder();初始化指令译码器在simpleuitil/target-pisa/pisa.c中,载入指令集定义文件machine.def,将指令操作码和操作码枚举表对应起来
sim_init();初始化模拟器功能模块包括寄存器初始化,内存初始化:
struct mem_t {
/* memory object state */
char *name; /* name of this memory space */
struct mem_pte_t *ptab[MEM_PTAB_SIZE];/* inverted page table */
/* memory object stats */
counter_t page_count; /* total number of pages allocated */
counter_t ptab_misses; /* total first level page tbl misses */
counter_t ptab_accesses; /* total page table accesses */
} *mem;
sim_load_prog(char *fname,int argc,char **argv,char **envp)加载可执行程序到模拟器中包括打开EIO文件并设置寄存器和内存通过loader.c中ld_load_prog() 函数 ,包括读段数据并载入内存空间,判断大尾端小尾端,设置堆栈基地址和PC入口地址,预译码代码段?
sim_sdb = stat_new();
sim_reg_stats(sim_sdb);更新寄存器状态;
通过sim_main()函数进入模拟器功能模块执行;
在sim-safe.c中regs.regs_NPC = regs.regs_PC + sizeof(md_inst_t);初始化下一条PC
MD_FETCH_INST(inst, mem, regs.regs_PC);根据PC值在内存中取一条指令,包括为虚拟地址定位主机地址和将指令格式转成正确形式,这是一个宏定义
#define MD_FETCH_INST(INST, MEM, PC) \
{ inst.a = MEM_READ_WORD(mem, (PC)); \
inst.b = MEM_READ_WORD(mem, (PC) + sizeof(word_t)); }
MEM_READ_WORD不再展开;
接下来译码过程由宏MD_SET_OPCODE(op, inst);完成,它展开为如下:
#define MD_SET_OPCODE(OP, INST) ((OP) = ((INST).a & 0xff))
在取指阶段,由于PISA指令为64位指令,故在#define MD_FETCH_INST宏展开里面根据指令的定义格式:
typedef struct {
word_t a; /* simplescalar opcode (must be unsigned) */
word_t b; /* simplescalar unsigned immediate fields */
} md_inst_t;
将得到的指令在取指阶段转换成的正确格式高32位赋予inst.a,低32位赋予inst.b,所以在译码阶段取inst.a的低8位即为对应指令的操作码 ;
之后执行阶段进入sim-safe的switch循环,载入指令集定义文件machine.def(此文件为动态生成文件,在PISA架构下,真实的指令集文件为pisa.def)
将#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3)宏展开,宏的展开在machin.def中,根据op找到所要执行的指令的OP:
SYMCAT(OP,_IMPL);
匹配成功后通过SYMCAT 宏将OP和_IMPL连接起来组成新的宏定义OP_IMPL,此时在machine.def中找到宏 OP_IMPL对应的宏展开进行语义解析和执行,相关定义在sim-safe.c和pisa.h中;
综上所述,为simplescala添加PISA架构的的指令非常简单:
修改simplesim3.0/target-pisa/pisa.def 在指令集中添加自己的指令,在结尾还需为新加指令解宏
修改simpleutils-.../include/opcode/ss.h 在枚举表中加入指令,为初始化指令译码器提供方便
修改simpleutils-.../opcode/ss-opc.c 在结构体数组中加入指令,为编译器调用做准备?
遇到的问题:加入指令后重新编译编译器还是不识别加入的新指令
在simplescalar中添加基于PISA架构的指令的更多相关文章
- step6----->往工程中添加spring boot项目------->修改pom.xml使得我的project是基于spring boot的,而非直接基于spring framework
		
文章内容概述: spring项目组其实有多个projects,如spring IO platform用于管理external dependencies的版本,通过定义BOM(bill of mater ...
 - IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证
		
IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...
 - MFC中 给基于CFormView的单文档添加背景图片
		
关于基于CFormView的单文档应用程序,添加一个图片背景的方法之一如下: 下面是利用LoadImage实现.(先在程序目录中添加背景图片back.bmp) 1.在view类中添加类成员变量:(为C ...
 - 如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单
		
方法1:亲测 成功 转载自https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/48338f6b-e5d9-4c0c-8b17-05ca3ef ...
 - Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)
		
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
 - Yii2 基于RESTful架构的 advanced版API接口开发   配置、实现、测试
		
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
 - Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课
		
Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用Q Q群直播方式进行直播,价值99元视频课程免费直播.完整的基于Swift项目实战,手把手教你做一个Swift版i ...
 - Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试【转】
		
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
 - JAVAEE——宜立方商城02:服务中间件dubbo、工程改造为基于soa架构、商品列表实现
		
1. 学习计划 第二天:商品列表功能实现 1.服务中间件dubbo 2.工程改造为基于soa架构 3.商品列表查询功能实现. 2. 将工程改造为SOA架构 2.1. 分析 由于宜立方商城是基于soa的 ...
 
随机推荐
- kubernetes 内网节点部署笔记(一)
			
在Centos7上部署kubernetes时,碰到很多坑,特别在摸拟在内网部署时,有来自GFW的障碍,有来自Firewalld的阻塞,反正是各种不服,终于慢慢理顺了思路,自己记录一下,防止遗忘. 环境 ...
 - 剖析JavaScript函数作用域与闭包
			
在我们写代码写到一定阶段的时候,就会想深究一下js,javascript是一种弱类型的编程语言,而js中一个最为重要的概念就是执行环境,或者说作用域.作用域重要性体现在哪呢?首先,函数在执行时会创建作 ...
 - VC非法内存值的判断
			
0xcdcdcdcd - Created but not initialised0xdddddddd - Deleted0xfeeefeee - Freed memory set by NT's he ...
 - vs文件属性(生成操作)各选项功能(发布Web项目时使用)
			
转自:http://www.cnblogs.com/paulhe/p/4490583.html 右击项目里的文件,选择属性(F4)会有[生成操作]的选项. 它提供了14项选择,如图: 在这说一下常用的 ...
 - 关于android截图的一些方法
			
这里只记录一些链接,对于我的需求,只需要, public static String createScreenShot(View v) { //测试截屏功能 SimpleD ...
 - java的基本程序设计之个人总结要点
			
java的基本程序设计之个人总结要点 这是个人看完java核心卷一书之后,罗列的一些比较重要的点子,希望共享给大家. [数值类型] 1.从java7开始,加上前缀0b就可以写二进制数,例如:0b100 ...
 - 进击的docker 二 : docker 快速入门
			
1.安装docker 1.1.安装环境 [root@docker ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@docke ...
 - Thinkphp源码分析系列(六)–路由机制
			
在ThinkPHP框架中,是支持URL路由功能,要启用路由功能,需要设置ROUTER_ON 参数为true. 开启路由功能后,系统会自动进行路由检测,如果在路由定义里面找到和当前URL匹配的路由名称, ...
 - centos 6.5 x64创建并挂载使用iscsi共享磁盘
			
前景摘要:NFS或iSCSI,哪个更好?文件 vs 块NFS使用文件级别的实施,服务器或存储阵列托管整个文件系统,客户到文件系统上读写文件,可以在阵列端对主存储数据进行重复数据删除.iSCSI和FC则 ...
 - Hibernate中的数据库方言(Dialect)
			
在配置hibernate.cfg.xml时需指定使用数据库的方言: 例: <property name="dialect">org.hibernate.dialect. ...