基于ARM体系的虚拟机的构架实现 ——ARM CPU 的模拟-毕业论文_第1页
基于ARM体系的虚拟机的构架实现 ——ARM CPU 的模拟-毕业论文_第2页
基于ARM体系的虚拟机的构架实现 ——ARM CPU 的模拟-毕业论文_第3页
基于ARM体系的虚拟机的构架实现 ——ARM CPU 的模拟-毕业论文_第4页
基于ARM体系的虚拟机的构架实现 ——ARM CPU 的模拟-毕业论文_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

本科毕业论文(科研训练、毕业设计)题 目:基于ARM体系的虚拟机的构架实现ARM CPU 的模拟姓 名:学 院:软件学院系:专 业:软件工程年 级:学 号:指导教师(校内): 职称: 年 月33【摘要】IBM早在1960年就认识到虚拟化技术的重要性, 于是开发了型号为Model 67的System/360主机. Model 67主机通过虚拟机监视器(VMM, Virtual Machine Monitor)虚拟所有的硬件接口. 在早期的计算中, 操作系统被称做Supervisor. 能够运行在其它操作系统之上的操作系统被称做hypervisor(名称首次出现在1970年).随着时代的发展,嵌入式开发应用已经深入各个领域,前景十分看好。目前,嵌入式开发方式都以实际硬件为主,由于代价较高,不利于学习和开发调试,使得嵌入式开发门槛较高,难以普及。虚拟机是一项应用广泛的技术,它也早已在嵌入式开发中得到大量的应用。在嵌入式开发中,很多时候,我们只需要在虚拟机中调试我们的程序,就可以让程序很好地移植到实际硬件平台上执行。ARM系列CPU是目前最成功和最广泛地应用于嵌入式的CPU系列。众所周知的GBA就是ARM体系的产品实例。我们的目标是实现一个基础的ARM体系的虚拟机。关键字:ARM;指令;译码;流水线;寻址AbstractThe destination of this article is to design a virtual machine based on ARM architecture. IBM corp. had recognized the importance of virtualization technology since 1960. So they developed the Model67 System/360 host machine. Model67 host machine simulates all hardware I/O ports via Virtual Machine Monitor(VMM). In the early computations, operation system is called Supervisor. And the system which runs above other operation systems is called Hypervisor(First called since 1970). As time goes on, embedded system development and application had gone deep into every field. The foreground is quite bullish. Nowadays, most embedded developing style follows the real-hardware-developing pattern. Since the cost of such development is very high. And the pattern is not easy to debug and for beginner to learn. The embedded development requires high ability and is hard to gain ground. Virtual Machine is a widely applied technology. It had been widely used on many embedded development fields. Follow the VM-developing pattern, we can debug our programs on VMs and then let them run on real hardware. ARM series CPU is one of the most successful CPU standards. For example, the well known GBA products. Our destination of us is to realize a simple ARM Virtual Machine.Keywords: ARM; instruction; decode; pipeline; addressing目 录第一章 引言1第二章 总体设计42.1 ARM CPU寄存器组成42.2 ARM 指令与流水线简述42.3 软件模拟ARM CPU指令集52.4 指令解析模块设计模式6第三章 详细设计83.1 ARM CPU的逻辑结构83.2 处理器模式83.3 ARM CPU寄存器组织93.4 ARM CPU指令123.5 寻址方式15第四章 系统实现174.1 构造CPU状态174.2 映射译码函数184.3 寻址方式的实现184.4 构造指令状态244.5 整合流程254.6 运行测试27第五章 结束语30致 谢31参考文献32ContentsChapter 1 Instruction1Chapter 2 Overall design42.1 ARM CPU registers42.2 ARM instructions and pipeline42.3 Software emulated ARM CPU instruction set52.4 Instruction parsing design pattern6Chapter 3 Detailed design83.1 The logical structure ARM CPU83.2 CPU modes83.3 ARM CPU registers93.4 ARM CPU instruction set123.5 Addressing15Chapter 4 System realization174.1 Construct the CPU status174.2 Mapping the decode function184.3 The realization of addressing184.4 Construct the instruction status244.5Compound all together254.6 Run and test27Chapter 5 Summary30Acknowledgement31References32第一章 引言所谓虚拟机软件,是一种以原有的操作系统为基础,在宿主机上使用额外的硬盘空间通过软件级的模拟,(提供一组标准的 API和可选的实时编译器,仿真一个标准的CPU及操作系统的 API 集,虚拟机从其自定义的 API 到操作系统 API 之间进行“翻译”)创建一个或多个的运行有单独互不干扰的操作系统的虚拟计算机,并可将其连成一个网络的软件。“虚拟化”是一个软件层,能够将软件与硬件隔离,将所有可用的计算和存储资源以资源池的方式组成一个单一的整合视图,通过提供虚拟功能,将资源看作一个单一公共的平台,最终资源池就像我们日常生活中的水和电一样,成为企业信息系统中的“公用设施”(Utility Computing)。其做为虚拟机的扩展技术。虚拟化并不是一个新技术,早在60/70年代,IBM就已经在360/67,370等硬件体系实现上虚拟化。虚拟化通过VMM(Virtual Machine Monitor)把一个硬件虚拟成多个硬件(VM,Virtual Machine),各VM之间可以认为是完全隔离的。这个隔离不同于各进程之间的地址空间隔离。无论是内存,设备,还是处理器等对各VM来讲,都被认为是自已独一套的。在VM上可以运行“任何”的操作系统(称为Guest OS)而不会对其它的VM产生影响。它首先出现在大型主机上,现在在Unix服务器上也已经普及,并正在向配置英特尔公司至强处理器的服务器上蔓延。微软和VMware采用基于软件的方法实现“虚拟化”和分区,但英特尔公司则计划通过硬件提供对虚拟化的支持。英特尔正酝酿把两种相关的虚拟功能纳入Pentium 、Xeon和Itanium 处理器,赋予这些芯片支持多重操作系统的能力。就桌面型芯片而言,此功能称为Vanderpool技术(VT),就服务器而言称为Silvervale技术(ST)。Silvervale和Vanderpool会提供界面功能,让操作系统得知例如有网络信息传入等硬件中断的情况。这些功能会随下一代Windows 操作系统(代号“Longhorn”)推出。能够被EMC公司的VMWare、微软公司未来的VirtualPC和VirtualServer、以及Linux虚拟软件使用,CPU层面实现仿真。AMD也会在未来推出名为Pacifica的类似于Intel Vanderpool和Silvervale的自有技术。对于用户来说,虚拟计算资源将带来非常明显:首先,会提高资源利用率,避免复杂的系统集成和大规模的设备占用空间,降低投资成本;其次,可以简化管理的复杂性,能对整体系统运行环境进行统一监管和动态分配,从而能够降低计算管理和运行成本;第三,可以充分利用整体平台的优势,更好地发挥系统的效能;第四,从总体上可以提高全系统的可靠性。我们的目标就是实现一个基于ARM体系的虚拟机。到目前为止,ARM微处理器及技术的应用几乎已经深入到各个领域:工业控制领域:作为32的 RISC 架构,基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展,ARM微控制器的低功耗、高性价比,向传统的8位/16位微控制器提出了挑战。n 无线通讯领域:目前已有超过85%的无线通讯设备采用了 ARM 技术, ARM 以其高性能和低成本,在该领域的地位日益巩固。n 网络应用:随着宽带技术的推广,采用ARM技术的 ADSL芯片正逐步获得竞争优势。此外,ARM 在语音及视频处理上行了优化,并获得广泛支持,也对DSP的应用领域提出了挑战。n 消费类电子产品:ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛采用。n 成像和安全产品:现在流行的数码相机和打印机中绝大部分采用 ARM 技术。手机中的 32位 SIM 智能卡也采用了ARM技术。除此以外,ARM 微处理器及技术还应用到许多不同的领域,并会在将来取得更加广泛的应用。n ARM体系结构的版本指的是ARM对应的各种指令集。目前一共定义了6个版本n ARM处理器系列则是由各个厂家实现的各种实际物理MCU或CPU,目前主要有n ARM7:130MIPS(MAX),TDMI版本不支持MMUn ARM9:5级整数流水线,支持MMUn ARM9E:支持DSP,5级整数流水线,300MIPS(MAX),n ARM10E:400MIPS(MAX),支持DSP,6级整数流水线,n SecureCore:安全支持,软内核,防扫描探测。仿真处理器,也叫做P-code(or pseudo-code)机. P-code是一种机器语言,运行在虚拟机上而不是实际的硬件。知名的P-code语言在1970年由加州大学圣地亚哥分校的Pascal系统项目组开发。它可以把Pascal程序编译成P-code代码, 然后在具有P-code功能的虚拟机上运行。P-code程序具有高度可移植性, 能够运行在任何具有P-code功能的虚拟机上。1960年的BCPL语言(基本组合程序设计语言, Basic Combined Programming Language)也使用了同样的概念, 它是C语言的前身。编译器首先把BCPL代码编译成一个中间机器代码:O-code。然后,O-code被编译成目标机器代码. P-code模型已被广泛使用到各种编译器当中,从而为编译器移植到新的主机架构提供了复杂性.(通过一个中间语言分成前端和后端)。我们所采用的仿真器版本是ARM7,实例软件以GBA模拟器为例。ARM7 系列微处理器为低功耗的 32 位 RISC 处理器,最适合用于对价位和功耗要求较高的消费类应用。 ARM7 微处理器系列具有如下特点:n 具有嵌入式 ICE RT 逻辑,调试开发方便。n 极低的功耗,适合对功耗要求较高的应用,如便携式产品。n 能够提供 0.9MIPS/MHz 的三级流水线结构。n 代码密度高并兼容 16 位的 Thumb 指令集。对操作系统的支持广泛,包括 Windows CE、Linux、Palm OS等。指令系统与 ARM9 系列、 ARM9E 系列和 ARM10E 系列兼容,便于用户的产品升级换代。主频最高可达 130MIPS ,高速的运算处理能力能胜任绝大多数的复杂应用。ARM7 系列微处理器的主要应用领域为:工业控制、Internet 设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用。ARM7系列微处理器包括如下几种类型的核:ARM7TDMI、ARM7TDMI-S、ARM720T、 ARM7EJ。其中,ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器,属低端ARM处理器核。本文主要介绍ARM7 CPU指令的模拟以及部分CPU结构剖析。第二章 总体设计2.1 ARM CPU寄存器组成ARM CPU有37个内部寄存器。分为8个全局通用寄存器,5个用户(系统)寄存器,5个快速中断寄存器(FIR),一个程序读数器,6套堆栈指针、返回地址寄存器共12个寄存器,6个程序状态字。模拟ARM CPU的执行相当于解释执行ARM指令集,并改变虚拟CPU的寄存器状态。2.2 ARM 指令与流水线简述ARM体系CPU逻辑上分为取指单元、译码单元和执行单元。CPU运行阶段为三级流水线并行模式。CPU向前预取两条指令,译码单元对前一条指令进行译码,执行单元执行当前指令。本系统也将CPU分成这三个逻辑阶段,取指阶段从内存前向预取第二条指令,这个阶段很简单,只是从内存读出一条指令放在指令队列。译码阶段从指令队列取出一条指令进行部分译码,这个阶段也不复杂。执行阶段须要对整条指令解析,选择执行微指令。ARMv7包括如下类型指令:n 跳转指令 n 数据处理指令 n 状态寄存器转移指令 n 存储指令 n 协处理器指令 n 异常产生指令 每一类指令各自共享一些只有微小差别的微指令集合,通过这些微指令组合成每条指令的功能。设计译码指令时,要特别注意每条指令的细节动作,这些动作反应在微指令的功能上。设计微指令时,既要使微指令十分精确地完成它该做的事,又不能使微指令译码嵌套太多,以免影响解析执行的速度。需要综合权衡各种译码方法,选出从代码量、可维护性与执行效率都可以接受的一种。本文叙述方法为按位段映射指令译码方式。ARM系列的CPU是精简指令集CPU,基本上,每条指令都由条件码、操作码、(移位)寄存器和(移位)立即数组成。存取内存由专用的指令完成。ARM指令有32位指令和16位Thumb指令两种指令格式。指令地址分别为32位对齐和Thumb指令的16位对齐。由于Thumb指令并非本文设计的重点,本文只针对32位指令展开讨论。所以,下文如无特别说明,指令模式均指正常格式(32位ARM指令模式)。执行当前指令译码下一条指令预取前向第二条指令图2.1 三级流水线处理模式图2.2 部分ARM指令格式2.3 软件模拟ARM CPU指令集要在现有的软硬件平台上实现另一硬件平台的虚拟机,最理想的虚拟技术也须要几条以上的指令来模拟一条目标平台的指令。因此,效率对于虚拟机的来就显得格外重要。如何考虑虚拟机的执行效率以用可移植性、可维护性,是需要权衡折衷的问题。例如一条加法指令,要考虑计算结果的溢出、进位、是否为零以及符号等问题,如果用原平台无关的代码编写,则在保证可移植的同时会大大降低效率,若利用原平台的CPU来完成同样的加法运算,并把计算结果和标志复制到目标平台的CPU状态字里,则移植性大大降低,但执行效率却提高了不少。一种折衷的方案是,把后一种方法的代码集中在一个平台相关的文件,以宏或内联函数的形式被调用。这样,在移植到另一平台时只须替换掉平台相关的代码即可。另外是指令处理函数的映射问题,可以把一条指令解析成几条微指令来执行,解析程序结构化越强,源程序结构就越简洁容易理解,但函数嵌套层次太多导致程序执行效率低。另一种是位段映射,可以大大减少映射层数,但会使代码不容易理解。虚拟机是一类有特殊要求的软件,如何确定这类软件的设计规范要经过深思熟虑。2.4 指令解析模块设计模式CPU状态集(寄存器、状态字等)协处理器模块主程序循环映射、解析执行ARM指令内存映射I/O设备图2.3 译码执行流程其中主程序循环从协处理器模块取出指令,把指令传送给指令处理过程,经过映射、译码找出相应的指令处理过程,进而改变CPU状态集(包括通用寄存器与状态寄存器等),必要时访问协处理器模块,改变协处理器的内部寄存器状态。由于ARM体系采用内存IO映射方式,故无须处理特殊IO类指令。第三章 详细设计本章详细介绍ARM CPU结构的CPU软件模拟设计思想。3.1 ARM CPU的逻辑结构n ARM CPU的逻辑结构由三部分组成,即取指令单元、指令译码单元和执行单元。取指令单元负责从内存取出指令,存放在指令缓冲队列,一般预取两条指令。当执行到跳转指令时,指令队列被清空,预取的指令失效。n 译码单元从指令队列中取出一条指令对其进行译码,分析须要执行哪些微指令,要用到哪些寄存器等。当执行到跳转指令时,当前已译码的指令失效。n 执行单元负责执行已被译码的当前指令,这部分要做最多的工作,包括改变寄存器值、存取内存等。3.2 处理器模式ARMv7 CPU有7种处理模式,分别为用户模式、快速中断模式、普通中断模式、监督模式、非法访问模式、未定义模式和系统模式。表3.1 处理器工作模式处理模式说明Userusr普通程序执行模式FIQfiq快速中断模式,支持高速数据传输通道IRQirq通常中断处理模式Supervisorsvc操作系统保护模式Abortabt用于(虚拟)内存保护Undefinedund软中断或协处理器触发中断Systemsys操作系统特权模式模式可以通过软件改变,也可以通过外部中断或异常改变。大多数应用程序执行于用户模式,在这种模式下,不能改变执行模式或访问某些被保护的系统资源,除非触发异常。除了用户模式之外,其它模式都是特权模式,特权模式下可以自由访问系统资源。除了用户模式和系统模式之处,其它五种模式亦称为异常模式。系统模式仅在ARMv4以后版本才支持,这种模式使用与用户模式一样的寄存器,以免与异常处理用的寄存器冲突。3.3 ARM CPU寄存器组织ARM寄存器分为31个通用寄存器和6个程序状态字。共37个内部寄存器。通用寄存器包括R0R15,可以分为三类:n 未分组寄存器R0R7n 分组寄存器R8R14n 程序计数器PC(R15)未分组寄存器R0R7:在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途, 因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。分组寄存器R8R14:对于分组寄存器,他们每一次所访问的物理寄存器与处理器当前的运行模式有关。对于R8R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiqR12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usrR12_usr。 对于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下的记号来区分不同的物理寄存器:n R13_n R14_其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。R14也称作子程序连接寄存器(Subroutine Link Register)或连接寄存器LR。当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。举例来说,在irq模式下,可以用到的寄存器组为:R0R1R2R3R4R5R6R7R8_irqR9_irqR10_irqR11_irqR12_irqR13_irqR14_irqR15CPSRSPSR_irq寄存器R14常用在如下的情况:在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回:BLNEXT;跳转到子程序NEXT处执行NEXTMOVPC, LR;从子程序返回寄存器R15用作程序计数器(PC)。在ARM状态下,位1:0为0,位31:2用于保存PC;在Thumb状态下,位0为0,位31:1用于保存PC;虽然可以用作通用寄存器,但是有一些指令在使用R15时有一些特殊限制,若不注意,执行的结果将是不可预料的。在ARM状态下,PC的0和1位是0,在Thumb状态下,PC的0位是0。R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。由于ARM 体系结构采用了多级流水线技术,对于ARM指令集而言,PC 总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。在ARM状态下,任一时刻可以访问以上所讨论的16个通用寄存器和一到两个状态寄存器。在非用户模式(特权模式)下,则可访问到特定模式分组寄存器。图3.1 状态寄存器的标志位寄存器 R16 用作CPSR(Current Program Status Register,当前程序状态寄存器 ),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。图3.2 ARM CPU寄存器组织3.4 ARM CPU指令3.4.1 指令分类与结构ARM微处理器的指令集是加载/存储型的,也即指令集公能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如下表:表 3.2 指令集助记符指令功能描述ADC带进位加法ADD加法指令AND逻辑与指令B跳转指令BIC位清零指令BL带返回的跳转指令BLX带返回和状态切换的跳转指令BX带状态切换的跳转指令CDP协处理器数据操作指令CMN比较反指令CMP比较指令EOR异或指令LDC存储器到协处理器的数据传输指令LDM加载多个寄存器指令LDR存储器到寄存器的数据传输指令MCR从ARM寄存器到协处理器寄存器的数据传输指令MLA乘加运算指令MOV数据传送指令MRC从协处理器寄存器到ARM寄存器的数据传输指令MRS传送CPSR或SPSR的内容到通用寄存器指令MSR传送通用寄存器到CPSR或SPSR的指令MUL32位乘法指令MLA32位乘加指令MVN数据取反传送指令ORR逻辑或指令RSB逆向减法指令RSC带借位的逆向减法指令SBC带借位减法指令STC协处理器寄存器写入存储器指令STM批量内存字写入指令STR寄存器到存储器的数据传输指令SUB减法指令SWI软件中断指令SWP交换指令TEQ相等测试指令TST位测试指令3.4.2 指令的条件域当指令工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。每一条ARM指令包括4位的条件码,位于指令的最高4位31:28。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。在16种条件标志码中,只有15种可以使用,第16种(1111)为系统保留,暂时不能使用。表 3.3 条件码条件码助记符后缀标志含义0000EQZ置位相等0001NEZ清零不相等0010CSC置位无符号数大于或等于0011CCC清零无符号数小于0100MIN置位负数0101PLN清零非负数0110VSV置位溢出0111VCV清零未溢出1000HIC置位Z清零无符号数大于1001LSC清零Z置位无符号数小于或等于1010GEN等于V带符号数大于或等于1011LTN不等于V带符号数小于1100GTZ清零且N等于V带符号数大于1101LEZ置位或N不等于V带符号数小于或等于0110AL忽略无条件执行3.5 寻址方式所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持如下几种常见的寻址方式。n 立即寻址 操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数。n 寄存器寻址 利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。n 寄存器间接寻址 以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。n 基址变指寻址 将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。n 多寄存器寻址 一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。n 相对寻址 以程序计数器PC的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。n 堆栈寻址 堆栈是一种数据结构,按先进后出的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。对指令进行程序译码时,主要考虑指令本身的逻辑一致性和寻址多样性。译码程序首先调用各种寻址方式的微指令程序,分析出操作数,再根据操作数执行指令操作。第四章 系统实现我的任务是模拟ARM CPU指令译码与执行,由于ARM指令是32位的,所以译码起来相对容易。ARM CPU指令并不多,但寻址方式比较复杂。在译码时,要注意把寻址部分与指行部分尽量分开。4.1 构造CPU状态CPU状态用一个拥有37个成员的组结构体表示,每个成员表示一个寄存器。寄存器分多个组态,由寄存器组指针指定。表 4.1 寄存器组织R0R1R2R3R4R5R6R7R8_usrR8_fiqR9_usrR9_fiqR10_usrR10_fiqR11_usrR11_fiqR12_usrR12_fiqR13_usrR13_fiqR13_irqR13_svcR13_abtR13_undR14_usrR14_fiqR13_irqR14_svcR14_abtR14_undR15CSPRSPSR_fiqSPSR_irqSPSR_svcSPSR_abtSPSR_und比如,工作于用户态或系统态的CPU,所用的寄存器组为:R0R1R2R3R4R5R6R7R8_usrR9_usrR10_usrR11_usrR12_usrR13_usrR14_usrR15CPSR而工作于快速中断态的CPU,所用的寄存器组为:R0R1R2R3R4R5R6R7R8_fiqR9_fiqR10_fiqR11_fiqR12_fiqR13_fiqR14_fiqR15CPSRSPSR_fiq注意,在用户模式和系统模式下的CPU,SPSR是无效的,使用它会产生不可预测的结果。4.2 映射译码函数取指令码的一个位段作为映射索引,利用所映射的函数执行指令。映射位段取27:20共8位,映射函数表长256项。其中不一定每一项均对应有效函数项。4.3 寻址方式的实现ARM CPU有如下几种寻址类型:4.3.1 立即寻址立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:ADDR0,R0,#1;R0R0+1ADDR0,R0,#0x3f;R0R0+0x3f在以上两条指令中,第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。4.3.2 寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:ADDR0,R1,R2;R0R1R2该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。4.3.3 寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:ADDR0,R1,R2;R0R1R2LDRR0,R1;R0R1STRR0,R1;R1R0在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。第二条指令将以R1的值为地址的存储器中的数据传送到R0 中。第三条指令将R0的值传送到以R1的值为地址的存储器中。4.3.4 基址变址寻址基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示:LDRR0, R1,#4 ;R0R14LDRR0, R1,#4!;R0R14、R1R14LDRR0, R1,#4 ;R0R1、R1R14LDRR0, R1,R2 ;R0R1R2在第一条指令中,将寄存器R1 的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0 中,然后,R1 的内容自增4个字节。在第三条指令中,以寄存器R1 的内容作为操作数的有效地址,从而取得操作数存入寄存器R0 中,然后,R1 的内容自增4个字节。在第四条指令中,将寄存器R1的内容加上寄存器R2 的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。4.3.5 多寄存器寻址采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16 个通用寄存器的值。以下指令:LDMIAR0,R1,R2,R3,R4;R1R0;R2R04;R3R08;R4R012该指令的后缀IA 表示在每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可将连续存储单元的值传送到R1R4。4.3.6 相对寻址与基址变址寻址方式相类似,相对寻址以程序计数器PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL 采用了相对寻址方式:BLNEXT;跳转到子程序NEXT 处执行NEXTMOVPC, LR;从子程序返回4.3.7 堆栈寻址堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,ARM 微处理器支持这四种类型的堆栈工作方式,即:n 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。n 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。n 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。n 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。4.3.8 寻址方式ARM CPU的寻址多样性大部分来自数据处理指令和数据存取指令。ARM CPU有11种数据处理操作模式:n 立即数(#imm) 无须移位。n 寄存器(Rm) 通过寄存器寻址n 立即数逻辑左移(Rm LSL #imm)n 寄存器逻辑左移(Rm LSL Rs)n 立即数逻辑右移(Rm LSR #imm)n 寄存器逻辑右移(Rm LSR Rs)n 立即数算术右移(Rm ASR #imm)n 寄存器算术右移(Rm ASR Rs)n 立即数循环右移(Rm ROR #imm)n 寄存器循环右移(Rm ROR Rs)n 带进位循环右移(RRX Rm)由于ARM CPU的移位功能比x86 CPU的移位功能强,用x86 CPU移位指令功能模拟执行ARM CPU的移位操作需要附加操作。x86 CPU的移位操作数只取其前5位,如果移位操作数大于31,则移位操作仍然只取前5位,不会实质上地移位32次以上。而ARM体系的CPU则会产生直观的结果,如一个寄存器被逻辑左移32位,则这个寄存器会被清零。而x86的CPU会保持寄存器值不变。所以即便用C语言写移位子过程,也要判别移位操作数是否大于32、等于31等特殊情况。下面举一段移位子程序的伪代码:IF shift imm = 0 THENreturn RmELSEIF shift imm 32 THENshift carry out = BitTest Rm, 32 shift immreturn Rm LSL shift immELSE IF shift imm = 32shift carry out = BitTest Rm, 0return 0ELSEshift carry out = 0return 0END IFEND IF各种数据处理指令寻址方式的指令格式如下:立即数寻址其中,opcode是操作码,指示操作逻辑。S位指示指令执行完之后是否更新状态寄存器CPSR,当S = 1时,表示要更新状态寄存器。Rn是第一个操作数,Rd是目标寄存器,用于存放结果。rotate_imm是循环右移的次数,immed_8是8位立即数。第二个操作数的值就是immed_8循环右移rotate_imm位的结果。立即数逻辑左移寻址方式Rm存放第二个操作数的初值,shift_imm指示逻辑左移的次数。第二个操作数的值即是Rm LSL shift_imm。其于域的定义与上面相同。寄存器逻辑左移寻址方式Rs为移位寄存器,其于定义同上。立即数逻辑右移寻址方式寄存器逻辑右移寻址方式立即数算数左移寻址方式寄存器算数左移寻址方式立即数循环右移寻址方式寄存器循环右移寻址方式扩展循环右移寻址方式第二个操作数由RRX Rm产生,RRX即带进位的循环右移。4.4 构造指令状态读入指令码映射处理函数分析寻址方式执行处理逻辑更新处理器状态图4.1 模拟执行简图用于指示当前指令所用到的寄存器、操作数、地址等辅助信息,译码时把指令转换成指令状态信息,使寻址方式与指令执行相独立,有助于执行指令。指令状态构造过程即指令分析过程。译码分析过程如下图所示:整个CPU模拟过程其实描述起来不难,只是处理过程尽是一些细致枯燥的东西,主要是针对指令译码、映射方式、寻址方式与CPU处理模式这几方面下功夫。从模拟内存中读入一条指令(预取指令)需要从内存中读取数据?指令映射分析处寻址方式内存管理单元执行处理逻辑需要向内存中写入数据?更新CPU寄存器需要读内存需要写内存是否是

温馨提示

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

评论

0/150

提交评论