用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架构的指令的更多相关文章

  1. step6----->往工程中添加spring boot项目------->修改pom.xml使得我的project是基于spring boot的,而非直接基于spring framework

    文章内容概述: spring项目组其实有多个projects,如spring IO platform用于管理external dependencies的版本,通过定义BOM(bill of mater ...

  2. IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证

    IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...

  3. MFC中 给基于CFormView的单文档添加背景图片

    关于基于CFormView的单文档应用程序,添加一个图片背景的方法之一如下: 下面是利用LoadImage实现.(先在程序目录中添加背景图片back.bmp) 1.在view类中添加类成员变量:(为C ...

  4. 如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单

    方法1:亲测 成功  转载自https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/48338f6b-e5d9-4c0c-8b17-05ca3ef ...

  5. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  6. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  7. Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课

    Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用Q Q群直播方式进行直播,价值99元视频课程免费直播.完整的基于Swift项目实战,手把手教你做一个Swift版i ...

  8. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试【转】

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  9. JAVAEE——宜立方商城02:服务中间件dubbo、工程改造为基于soa架构、商品列表实现

    1. 学习计划 第二天:商品列表功能实现 1.服务中间件dubbo 2.工程改造为基于soa架构 3.商品列表查询功能实现. 2. 将工程改造为SOA架构 2.1. 分析 由于宜立方商城是基于soa的 ...

随机推荐

  1. 常用PHP函数类目录

    说明:用来记录我在开发过程中,经常用到的一些常用函数或者常用类. 常用函数 PHP常用函数 (1) 常用类 PHP表单数据校验类

  2. iterm2配色

    #enables colorin the terminal bash shell export export CLICOLOR= #sets up thecolor scheme for list e ...

  3. STL之容器适配器priority_queue

    priority_queue(优先队列)是一个拥有权值观念的queue,它允许加入新元素,删除旧元素,审视元素值等功能.由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素, 除此之外别 ...

  4. Salesforce 使用Js 调用Webservice实例

    1,创建 Custom Button 在页面上 2, 创建CustomJs 代码调用Webservice <!--参数名区分大小写,对于跨层object直接在Object名后直接加参字段名即可- ...

  5. Hash函数及其应用

    本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数 ...

  6. 细说 webpack 之流程篇

    摘自: http://taobaofed.org/blog/2016/09/09/webpack-flow/ 引言 目前,几乎所有业务的开发构建都会用到 webpack .的确,作为模块加载和打包神器 ...

  7. 交换芯片收发包的 DMA 实现原理

    交换芯片支持:报文.计数.表项3种DMA类型,其中报文DMA包括系统从芯片到接收报文或发送报文到交换芯片,计数DMA用来从片上获取统计计数,表项DMA功能分为SLAM DMA(系统内存DMA到片上交换 ...

  8. arcgis中DEM如何生成等高线

    地形图指比例尺大于1∶100万的着重表示地形的普通地图(根据经纬度进行分幅,常用有1:100万,1:50万,1比25万,1:15万,1:10万,1:5万等等).由于制图的区域范围比较小,因此能比较精确 ...

  9. 面试中遇到的iOS笔试题

    1.浅复制和深复制的区别? 2.类别的作用(category)?继承和类别在实现有何区别? 3.类别(category)和类扩展(extension)的区别. 4.obc中的协议和java中的接口概念 ...

  10. HTTP权威指南笔记-2.URL与资源

    2.1 URI与URL.URN URL是浏览器寻找信息时所需的具体位置.URl是人们对HTTP和其他协议的常用访问点:浏览器指向一个URL,浏览器就会发送适当的协议报文向服务器获取内容. URI是一类 ...