模拟器结构论文:GDB_第1页
模拟器结构论文:GDB_第2页
模拟器结构论文:GDB_第3页
模拟器结构论文:GDB_第4页
模拟器结构论文:GDB_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

模拟器结构论文:GDB-sim模拟器结构剖析摘要:本文从结构上剖析了gdb—sim模拟器,对configure文件进行了解释、对动态的程序接口、静态的数据结构进行了分析。在硬件结构模拟上对cpu、内存、总线、设备的模拟及在行为模拟上对cpu取指令(fetch)、指令解码(decode)、指令执行(execute)行为和外设行为的模拟分别进行了描述。关键词:模拟器、gdb、sim、cpu模拟、硬件模拟、设备模拟一、引言gdb,作为一种很优秀的开源调试器,是gnu开发工具链中很重要的产品,由于其适用于多种平台及对多种cpu的支持而受到普遍的关注。在pc上进行开发嵌入式程序时(例如mips、arm程序),不能在pc的x86平台上进行调试,只能通过仿真器连接开发板进行调试或通过gdb内嵌的sim模拟器进行调试。在进行非驱动开发时,使用内嵌sim模拟器调试是一个较好的选择。本文将对sim模拟器的结构及运行进行剖析。二、配置及编译产生可执行程序的过程为配置、编译、安装。该模拟器支持arm、mips、powerpc、hitachisuper-h等cpuo在编译前要通过configure来指定target。例如:./configure--target二mips在configure后,执行命令make。产生可执行文件run和库文件libsim.a。最后通过执行命令makeinstall安装run到usr/local/bin目录下和安装libsim.a到usr/local/lib目录下。在这三个过程中用到了configure和makefile两个文件。configure分析gnu的模拟器支持多类型的cpu,通过configure的target选项来配置不同的cpu系统。例如:在linux或cygwin下配置mips模拟器执行命令./configure--target二mipsconfigure主要作用:根据target决定模拟器挂载的设备生成相关环境变量(包括源文件路径、可执行文件路径、库文件路径等)读入makefile.in文件,根据配置生成makefile文件。相关部分代码:case〃${target}〃in

mips*-*-*)//targetmips*-*-*)//target=mips的设置#themipssimulatorcanonlybecompiledbygcc.sim_target=mipsonly_if_gcc=yesextra_subdirs="${extra_subdirs}igen",,makefile分析makefile.in文件是与target无关的,经configure生成的makefile才是和具体target相关的通过make来生成相应的模拟器。在makefile中含有target决定编译的路径、编译的文件。makefile主要作用:配置编译环境变量编译・c源文件为・o目标文件编译单机版模拟器run编译库文件libsim.a供gdb调用三、模拟器版本模拟器有单机版和gdb内嵌版两种版本。在gdb内嵌版中,模拟器给gdb提供了一套程序接口函数,供gdb驱动使用。在单机版中,主函数也会调用这套接口函数,脱离gdb的控制独立运行。1・单机版在sim/common/nrun.c有一个main主函数,编译后产生run可执行程序,控制模拟器的运行,不受gdb控制。使用方法:./run目标程序目标程序参数编译后的run程序在makeinstall后,会根据target不同名称,更改为target-run(例如mips-run、lx5280-run)拷贝到bin目录下。2.gdb内嵌版内嵌在gdb中,被gdb调用在gdb中使用命令(gdb)targetsim连接gdb内嵌模拟器四、模拟器程序接口模拟器给gdb提供了一套程序接口函数,。在单机版中,主函数也会调用这套接口函数。1.供单机版main函数和gdb内嵌版调用的接口sim_open()打开模拟器,建立相关的数据结构sim_load()装入运行在模拟硬件上的bfd文件sim_create_inferior()模拟器初始化,设置寄存器初始值砸@中国学术期刊网.sim_resume()模拟器模拟运行sim_stop()请求模拟器停止运行sim_stop_reason()读模拟器停止原因sim_close()模拟器停止,释放数据结构sim_do_command()特殊命令的接口2.供gdb调试调用的接口sim_read()读被模拟memorysim_write()写被模拟memorysim_fetch_register()读被模拟cpu的寄存器//需修改sim_restore_register()写被模拟cpu的寄存器//需修改sim_set_breakpoint()断点设置命令sim_clear_breakpoint()清除断点sim_clear_all_breakpoints()清除所有断点sim_enable_breakpoint()断点有效/无效设置sim_disable_breakpoint()禁止断点sim_enable_all_breakpoints()使能所有断点sim_disable_all_breakpoints()禁止所有断点五、主要数据结构gnu模拟器设计为对称多处理器(smp)结构,但并不完善,不过单处理器模拟还是很成熟的。这章对模拟器中的模拟器状态结构、cpu结构、总线存储器结构作一个描述,关于cpu外设备的结构单独在3.7节描述。1・模拟器状态sim_state结构这里的模拟器状态结构并不是这个模拟器程序的状态,而是指一个包括cpu结构、总线存储器、设备树,及模拟器运行状态的一个根结构。包括:cpu结构在模拟器上运行的target程序总线、存储器结构指针cpu外部设备硬件树root指针target程序断点运行弓[擎engine定时事件链表(每条指令执行前都会查询是否有定时事件方式)模块链表(参数处理、事件队列、存储器、程序断点等模块的初始化、安装、以下、挂起、退出处理)cpu数据结构_sim_cpu这里模拟单个cpu的结构和个性行为。和移植工作密切相关。它的结构主要包括:通用、控制、状态、浮点寄存器。寄存器宽度(用于读写操作)流水线的延迟写队列pendingdelay-slot状态模拟存储器参数及指针读写寄存器、内存方法指针原子操作位llbit总线、存储器结构_sim_core在这里总线、存储器合并为core结构,若地址mapping的device为null,则读写buffer中的模拟内存,若device不为null,则该地址为设备地址,读写device。程序读、写、执行、io口可设为不同mapping,但通常指向同一mappingo六、运行跟踪这里围绕模拟器的动态运行,逐步分析模拟器的初始化,装载程序,运行,退出,分析模拟器的函数调用过程。1・模拟器初始化在这里建立一个模拟器的数据结构,并初始化。。、申请内容空间,建立模拟器(cpu、内存、其他硬件)的数据结构。b、根据选项配置模拟器。C、分析被运行在模拟器上程序的结构并打开。源码摘要:sd=sim_open(sim_open_standalone,&default_callback,null,argv);//生成sim结构sim_pre_argv_init(sd,argv[0]);//初始化sim_add_option_table(sd,null,mips_options);//加载mips选项sim_parse_args(sd,argv);//参数处理sim_do_command(sd,“memoryregion0x7fff8000,0x8000”);//加载模拟内存2.装载程序a、分析程序的bfd文件结构。b、装载到模拟内存上。源码摘要:prog_bfd=bfd_openr(name,0);〃打开bfd格式文件,读入到bfd结构中sim_load(sd,nam,prog_bfd,0);//装入程序到模拟内存调用sim_analyze_program(sd,prog_name,prog_bfd);//分析程序调用sim_load_file(…);//装载文件sim_create_inferior(sd,prog_bfd,prog_argv,null);运行程序a、运行准备,各模块resumeob、事件预处理(查询事件链表是否有定时事件发生,若有,执行其函数)。c、运行取指令(根据cia,从存储器读指令)指令解码(在idecode.c文件中idecode_issue函数解码)指令执行(执行解码后得到的指令行为函数)计算下条指令地址d、判断结果,检测是否有异常或设有断点,决定是否继续运行。源码摘要:sim_resume(sd,1/*step*/,0);调用sim_module_resume(sd);//启动模拟器各模块调用sim_events_preprocess(sd,・・•・);//处理cpu的事件调用sim_events_process(sd);调用sim_engine_run(sd,next_cpu_nr,nr_cpus,siggnal);//支持多cpu调用instruction_wordinsn=ifetch32(sd,cpu,(cia),(cia));//取指调用addresstranslation(vaddr,&paddr,&uncached,…);//转换地址调用loadmemory(…);调用cia=idecode_issue(sd,insn,cia);//解码、执行指令操作调用switch(extracted32(instruction_0,5,0))调用case:{nia=semantic_and_special(sd,instruction.。,cia);//semantics调用do_add();//support.c4・模拟器退出模拟器退出比较简单,在执行各模块链表退出函数(释放各模块结构)后释放模拟器状态结构。a、执行各模块链表退出函数。b、释放模拟器状态结构。C、返回。调用函数为:sim_close(sd,0);七、结束语本文介绍了gdb-sim模拟器的基本原理、基本结构及实现方法,通过本文的分析,可以了解gdb-si

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论