一种基于GDB可配置框架的ARM7仿真目标机实现方法与流程

文档序号:11690954阅读:218来源:国知局
一种基于GDB可配置框架的ARM7仿真目标机实现方法与流程

本发明涉及嵌入式系统技术领域,尤其涉及一种arm7仿真目标机实现方法。



背景技术:

目前,嵌入式系统已经在不知不觉中走进大家的生活,如智能手机、智能冰箱、高智能汽车等等。在这些终端中,都存在嵌入式系统的影子。嵌入式系统是以应用为中心、以计算机技术为基础、软硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

嵌入式系统的开发包括硬件与软件两个部分,硬件的开发通常先于软件,硬件的设计、制板与调试过程往往要消耗大量时间,其必然导致软件研制起始节点的滞后,造成整体开发进度的拖延。因此,软硬件协同开发相关方法和理论一直是学术界和工业界努力的方向。所以,基于特定体系结构的仿真目标机就进入了人们的视线,它可以以软件仿真硬件环境,提供测试代码运行所需要的硬件资源仿真,这样,在硬件需求提出后,并不需要真正的硬件出厂,就可以进行软件的研制以及调试。但是,这类的仿真环境往往成本很高,而且体系单一,例如arm结构、sparc结构、x86结构,每一种结构都有自己独立的一套仿真环境,不具备通用性,使用起来非常不方便,对企业开发成本会造成很大的负担。



技术实现要素:

为了解决现有技术中的问题,本发明首先对传统gdb结构进行优化改造,使其在提供文件解析、调试功能的基础上增加对可配置性的支持,具有通用性框架,支持多种体系结构;然后,在gdb可配置框架基础上,提出了一种实现arm7仿真目标机的方法。

为达上述目的,本发明通过以下技术方案实现:

一种基于gdb可配置框架的arm7仿真目标机实现方法,所述仿真目标机运行的宿主机基于windows系统,处理器仿真内核以及仿真外部设备以动态链接库dll的形式提供,由gdb加载处理器仿真内核dll,由处理器仿真内核加载仿真外设dll;所述方法包括:

对gdb的通用性优化:

首先对gdb的功能层进行改造,将gdb中与目标结构相关的数据结构进行通用性的扩充,使其能够支持多种目标结构,同时将数据交互、函数调用的紧耦合部分全部改为通用调用接口,将仿真器抽取出来与gdb分离,以可动态加载的动态链接库形式提供;

然后对gdb的目标抽象层进行改造,使gdb可解析多种可执行文件结构;

再对gdb的仿真目标层进行改造,直接将仿真目标层从gdb中抠出,gdb只能访问到通用接口,而仿真器功能及其接口的实现则由通用仿真核通过动态链接的形式提供,完成gdb对指令集仿真访问的通用性优化;

在gdb的可配置框架下实现arm7体系结构的指令集仿真器模块,构建arm7仿真目标机的仿真内核,具体为根据arm7处理器体系结构和指令集的特点,确定以下基本的操作:1)三级流水线的更新操作、2)指令的条件码判断、3)移位操作、4)alu操作、5)寄存器访问、6)存储器访问;通过以上几种基本的操作,能够完成对大多数指令执行逻辑的仿真。

附图说明

图1是本发明的仿真目标机系统整体结构示意图;

图2是gdb层次结构示意图;

图3是可配置gdb与仿真内核之间的关联示意图;

图4是可配置gdb与仿真内核的通用性接口示意图;

图5是可执行文件的分析执行过程示意图;

图6是arm7内核仿真函数流程图;

图7是立即数移位处理过程示意图。

具体实施方案

下面通过具体实施方式结合附图对本发明作进一步详细说明。

本发明设计的仿真目标机主要功能是模拟arm7等处理器对指令集的处理能力。当仿真器获得可执行程序文件之后,通过gdb的解析,将应用程序的代码段、数据段等加载到仿真器的虚拟内存中,之后仿真器就可以在内存中取指、译码、执行,这样可以模拟在真实arm7处理器上的运行效果。同时,整个仿真环境还将提供若干个仿真外设,与处理器仿真内核共同工作,搭建用户需求的仿真环境。

本发明的仿真目标机系统整体结构如附图1所示,仿真目标机运行的宿主机是基于windows系统,处理器仿真内核以及仿真外部设备将以动态链接库dll的形式提供。由gdb加载处理器仿真内核dll,由处理器仿真内核加载仿真外设dll。基于gdb,仿真目标机实现了部分源代码级的调试功能。gdb本身就是一款强大的调试器,仿真内核以dll的形式提供,也就是说gdb本身并没有底层的仿真例程,只有上层解析功能,许多仿真器相关的调试功能是空缺的。因此,这些仿真器相关的调试功能就需要由仿真内核自己来实现。仿真内核主要实现的调试功能有仿真线程的启动、程序的仿真运行启动、程序运行暂停、程序运行恢复、程序强制停止退出、各种断点操作、查看寄存器/内存信息、查看仿真核运行状态等。

gdb(thegnuprojectdebugger)是gnu开源组织发布的一个强大的unix下的程序调试工具。一般来说,gdb主要完成下面四个方面的功能:

1)启动被调试程序,可以按照自定义的要求随心所欲的运行程序。

2)可让被调试的程序在所指定的调试断点处停住。

3)当程序被停住时,可以检查此时程序中所发生的事。

4)动态的改变程序的执行环境。

gdb拥有很多的功能层次,各层次之间用过一定的协议进行通信控制,gdb的层析结构分析如附图2所示,gdb可以大致分为5个层次:i/o抽象层、控制层、功能层、目标抽象层和仿真目标层。其中,i/o抽象层主要处理gdb的命令循环等信息交互的操作;控制层主要进行命令解析、表达式分析、信息提取等操作;功能层则是对具体命令的响应处理,包含大量的处理函数以及相应结构;目标抽象层则是对可执行文件进行符号解析等操作;最底层的仿真目标层则是对可执行程序进行仿真执行,产生结果。

但是传统gdb只能在初始化配置阶段完成一种体系结构的配置,不能满足对所有结构的通用性支持,因此需要对传统gdb结构进行优化改造,使其在提供文件解析、调试功能的基础上增加对可配置性的支持,具有通用性框架,支持多种体系结构,即将其仿真目标层替换为目标仿真内核,并且在其上部各个层次中找到体系结构依赖的部分,进行一致性的改造。gdb与指令集仿真器核的关系见附图3。

具体的优化改造的方法:

1)功能层:即gdb逻辑功能,本层次包含了与目标体系结构相关的一些数据结构设置,功能实现等。原有gdb只能加载一种目标体系结构的指令集仿真器(或称为目标核、仿真核),与仿真器之间的数据交互,或者叫做函数调用关系为紧耦合状态,不能支持多种结构,并且gdb调试解析功能与仿真器为耦合编译,最终为一个执行文件,无法进行拓展。一个成品gdb只能使用一种目标核,限制了gdb的通用性。而本发明首先就是对gdb的功能层进行了改造,将gdb中与目标结构相关的数据结构进行通用性的扩充,使其能够支持多种目标结构,同时将数据交互、函数调用的紧耦合部分全部改为通用调用接口,将仿真器抽取出来与gdb分离,以可动态加载的动态链接库形式提供。这样,改造之后的gdb为一个访问通用性接口,与目标核无需一同编译,结构分离的单独调试器。它与仿真器之间通过通用性接口完成函数调用与数据的交互,如附图4所示。

这样gdb功能层就完成了通用性的改造。综上,主要包含2个方面:1)对gdb与目标结构相关的数据结构进行了扩充,使其支持多种结构;2)函数调用紧耦合部分全部改为对通用接口的调用。

2)目标抽象层:本层次对可执行文件进行符号解析等操作,原本的gdb由于只能支持一种目标仿真器,故它只能解析与目标仿真器结构对应的文件结构,而本发明则使gdb可解析多种可执行文件结构,如elf文件、coff文件等等。

3)仿真目标层:本层在原有gdb结构当中充当指令集仿真器,需要与gdb一同编译,而本发明直接将本层从gdb中抠出,gdb只能访问到通用接口,而仿真器功能及其接口的实现则由通用仿真核通过动态链接的形式提供,完成gdb对指令集仿真访问的通用性优化。

以上所述为对gdb的通用性优化简述。优化方法以及通用框架下的目标机接口标准为本发明的一个创新之处,也是核心技术。

接下来在gdb的可配置框架下实现arm7体系结构的指令集仿真器模块,构建arm7仿真目标机的仿真内核。

arm处理器共有37个32位寄存器,包括:31个通用寄存器,含程序计数器(pc);6个状态寄存器,但只使用了其中的12位。这些寄存器按模式进行分组,每种模式使用自己拥有的寄存器。

arm7支持7种处理器模式,大多数应用程序在用户模式下执行。当处理器工作在用户模式时,正在执行的程序不能访问某些被保护的系统资源,也不能改变模式,除非异常发生。这允许操作系统来控制系统资源的使用。除用户模式外的其他模式称为特权模式。特权模式可以自由地访问系统资源和改变模式。

arm7指令集非常丰富,如条件执行指令、转移以及转移链接指令、软中断指令、数据处理指令、乘法指令、数据传送指令、多寄存器传送指令等等。

本发明的仿真器就是要仿真出真实的arm7硬件环境,对其寄存器、工作模式、所有指令均进行合理完整的仿真,并以动态链接库dll的形式提供。由gdb将可执行程序文件进行符号解析,之后将代码段、数据段等信息加载到仿真核虚拟内存中。仿真核将会在内存中进行取指,进而译码执行。其过程如附图5所示,整体的仿真流程如附图6所示:

附图6中表示的是正常情况下,仿真核接受到连续执行命令的调用,进而根据当前程序计数器pc值,进行取指,译码执行的情况。在上述流程中,并没有表示程序正常退出的情况,而是只有在遇到断点指令时才会退出仿真流程。

通常,一条指令的执行需要几个硬件操作,例如,读操作数、计算结果和将结果写回寄存器。本发明在描述指令功能时,也同样利用了上面的特点。首先,对基本的硬件操作(如流水线)进行c语言描述。然后,在译码完成后,根据指令的类型选择此指令所对应的操作,并根据操作之间的依赖关系对操作进行排序,即确定所有的操作以及它们的时间关系。

根据arm7处理器体系结构和指令集的特点,本发明确定了几个基本的操作:

1)三级流水线的更新操作

函数定义:voidupdatepipe()

在指令执行之前,均需要进行取指操作。由于arm7支持三级流水线,因此大多时候要执行的指令是在流水线中的,并且,取得本次需要执行指令之后还要更新流水线。

2)指令的条件码判断

函数定义:boolcharge()

指令的条件码判断是根据arm指令编码中的高4位条件码来判断cpsr中的条件标志位决定是否执行该指令。因为,条件码共有16种编码格式,因此可以定义长度为16的函数指针数组,对于每种情况均专门的函数进行判断。此外,通过高4位的值直接定位函数,能减少运行的消耗。

3)移位操作

函数定义:unit32shiftoperand(unit32,unit8)

首先判断指令中的第二操作数的表示形式,如果是立即数方式则获取操作数据,并设置cpsr中的c条件标志;如果是寄存器形式或寄存器移位形式,则根据移位操作数选择具体的移位函数。

4)alu操作

函数定义:基本运算

alu主要完成对二进制信息的定点算术运算、逻辑运算和各种移位操作。算术运算主要包括定点加、减、乘、除运算。逻辑运算主要有逻辑与、逻辑或、逻辑异或和逻辑非操作。移位操作主要完成逻辑左移和右移、算术左移和右移及其他一些移位操作。

5)寄存器访问

函数定义:boolgetreg(unit32nregid,unit32*pvalue)

boolsetreg(unit32nregid,unit32nvalue)

通过特定的函数进行寄存器的读取,直接给出寄存器号即可。这就要求仿真器事先要对所有的寄存器进行统一编号。

6)存储器访问

函数定义:boolgetmen(unit32addr,unit32nlength,

unit32*pbuff,unit32ndatasize)

boolsetmem(unit32addr,unit32nlength,

unit32*pbuff,unit32ndatasize)

通过特定函数进行内存的访问。需要给出访问的起始地址,数据宽度等信息。之后,函数将会把符合要求的数据存放在指定的缓冲区。

通过以上几种基本的操作,即可以完成对大多数指令执行逻辑的仿真。以数据处理为例,如下图7。

同样,仿真器中定义了各种异常模式,并设定了各种异常的向量入口地址,定义如下:

同时,还实现了处理各种异常的函数armul_abort(),其伪代码实现如下:

为了捕捉异常,本发明在三个位置设置了异常入口。这三个位置是:

1)仿真器取指令之前:用于捕捉复位异常、快速中断异常和一般中断异常。

2)仿真器取指、译码之后,执行之前:用于捕捉未定义指令异常和预取终止异常。

3)仿真器指令执行中:用于捕捉软件中断异常和数据终止异常。

以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1