(计算机系统结构专业论文)nano进程虚拟机的设计与实现.pdf_第1页
(计算机系统结构专业论文)nano进程虚拟机的设计与实现.pdf_第2页
(计算机系统结构专业论文)nano进程虚拟机的设计与实现.pdf_第3页
(计算机系统结构专业论文)nano进程虚拟机的设计与实现.pdf_第4页
(计算机系统结构专业论文)nano进程虚拟机的设计与实现.pdf_第5页
已阅读5页,还剩50页未读, 继续免费阅读

(计算机系统结构专业论文)nano进程虚拟机的设计与实现.pdf.pdf 免费下载

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

文档简介

i 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 摘摘 要要 计算机系统是一个复杂的结构,管理复杂性的关键是通过一些定义好的接口把 计算机系统分成不同的抽象层次,使得底层的实现细节可以被忽略,简化高层组件 的设计。然而定义好的接口也有限制,按照某个接口规范设计的子系统不能与按其 它接口规范设计的子系统工作。由于存在不同指令集的处理器和不同的操作系统, 以二进制程序发布的应用程序被绑定在一个特定的指令集和操作系统上。 虚拟化提供了一种放宽限制、增加灵活性的方式。当一个系统或子系统被虚拟 化,它的接口和通过接口可见的资源被映射到真实系统的接口和资源上,这个真实 系统被转变成一个不同的虚拟系统或多个虚拟系统。虚拟机能绕开真实机器兼容限 制和硬件资源限制来提供更高级别的软件移植性和灵活性。 进程虚拟机仿真用户级指令和操作系统调用,实现了在主机平台上执行采用不 同平台的指令集体系结构和操作系统接口的二进制程序。通过进程虚拟机的理论研 究,设计并实现了一个进程虚拟机系统模型,系统由一个汇编器和一个虚拟机运行 时构成。汇编器将汇编源代码翻译成虚拟平台的字节码文件,翻译过程可以细分为 参数处理、初始化、源代码加载、预处理、汇编语句到字节码指令的翻译、标签处 理、生成字节码文件。虚拟机运行时解释执行字节码文件,组合主机平台的指令来 实现与虚拟平台的字节码指令等价的功能,整个过程可以细分为命令行参数处理、 构建运行环境、字节码验证、指令执行。 经过运行测试与结果分析,整个系统实现了虚拟平台到主机平台不同指令集体 系结构和不同操作系统接口的转化,对进程虚拟机的理论和相关技术进行了验证。 关键词:关键词:进程虚拟机,汇编器,运行时,指令集,操作系统接口 ii 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 abstract modern computer systems are complex in architecture, the key to managing complexity in computer systems is their division into levels of abstraction separated by well-defined interfaces. levels of abstraction allow implementation details at lower levels of a design to be ignored, simplifying the design of components at higher levels. however, well-defined interfaces can also be confining, subsystems designed to specifications for one interface will not work with those designed for another. there are processors with different instruction sets, and there are different operating systems. application programs, when distributed as program binaries, are tied to a specific instruction set and operating system. virtualization provides a way of relaxing the foregoing constraints and increasing flexibility. when a system or subsystem is virtualized, its interface and all resources visible through the interface are mapped onto the interface and resources of a real system actually implementing it, the real system is transformed so that it appears to be a different virtual system or even a set of multiple virtual systems. virtual machine can circumvent real machine compatibility constraints and hardware resource constraints to enable a higher degree of software portability and flexibility. process virtual machine emulates both user-level instructions and operating system calls, it enables running binary programs with different instruction set architecture and different operating system interface on the host platform. through theoretical research on process virtual machine, design and implement a model of virtual machine system. the system is composed of an assembler and a virtual machine runtime. the assembler translates source program into virtual platforms byte-code file, the translation process can be subdivided into handling parameters, initialization, loading source program, pre-processing, translating assemble statements into byte-code instructions, processing labels, generating byte-code file. the virtual machine runtime interprets byte-code file and executes it, combines host platforms instructions to get the equivalent function of virtual platforms byte-code instruction. the whole process can be subdivided into handling command line parameters, constructing running environment, byte-code verification, executing instructions. through running tests and analyzing results, the whole system implement the transformation between virtual platform and host platform with different instruction set iii 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 architecture and different operating system interface, it verified the theory and related technologies of process virtual machine. key words: process virtual machine, assembler, runtime, instruction set architecture, operating system interface. 独创性声明独创性声明 本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得 的研究成果。尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他 个人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集 体, 均已在文中以明确方式标明。 本人完全意识到本声明的法律结果由本人承担。 学位论文作者签名: 日期: 年 月 日 学位论文版权使用授权书学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有 权保留并向国家有关部门或机构送交论文的复印件和电子版, 允许论文被查阅和 借阅。 本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据 库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密, 在 年解密后适用本授权书。 不保密。 (请在以上方框内打“”) 学位论文作者签名: 指导教师签名: 日期: 年 月 日 日期: 年 月 日 本论文属于 1 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 1 绪论绪论 为了获得新的能力并解决主要计算机系统组件接口中的一系列问题,虚拟机技 术在操作系统、编程语言和编译器、计算机系统结构这些领域取得了发展。在操作 系统方面,虚拟机在有效利用资源的同时维持了高级别的安全性;在编程语言方面, 虚拟机提供了平台无关性,同时支持透明的动态翻译和优化;在处理器结构方面, 虚拟机技术允许新指令集的引进,也支持减少耗能和优化性能的动态优化1。 1.1 课题来源、目的与意义课题来源、目的与意义 1.1.1 课题来源及目的课题来源及目的 本课题来源自宏正自动科技关于 virtual machine 项目的研究。 课题作为项目的一 部分,目的是研究虚拟机技术,了解虚拟机的原理,设计并实现虚拟机在编程应用 领域的一个模型系统 nano。 nano 虚拟机是一个运行时系统, 提供了字节码程序在其中得以执行的一个环境。 字节码程序执行时所需要的一切东西都由 nano 虚拟机来提供。比如,虚拟机负责为 应用程序分配内存,加载应用程序到分配的内存中,接着开始执行程序中的字节码 指令。如果该程序通过系统调用来请求位于底层的操作系统提供服务,虚拟机还必 须负责处理有关的服务请求2。 1.1.2 课题意义课题意义 随着计算机的不断发展,应用软件的开发速度远远落后于硬件和系统软件,用 户在选择新的硬件和系统软件之后不得不面临抛弃原有应用软件的难题;软硬件平 台的不断更新也使得应用软件的维护变得越来越困难3。 对于上面的问题,虚拟机技术则是一个完美的解决方案。虚拟机技术因为 java 语言的“一次编写,随处运行”而被应用在编程语言领域4。java 的成功得益于它的 java 虚拟机所建立的运行时系统平台,在操作系统和客户运用程序之间加入了由虚 拟机建立的一层实现5,6。虚拟机在编程语言方面提供的平台无关性,使得针对某个 虚拟机开发的应用软件在任何一个支持该虚拟机系统的平台上都能够运行。 2 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 1.2 国内外概况国内外概况 skyeye 是一个指令集模拟器,由清华大学计算机系的博士后陈渝提出。它基于 著名的uclinux组织的armulator模拟器软件开发, skyeye在通用的linux和windows 平台上实现一个纯软件仿真集成开发环境,模拟多种主流的嵌入式开发板和外设, 实现了一个可扩展的硬件模拟框架,使嵌入式操作系统可以在 skyeye 上运行,在 skyeye 上运行的操作系统意识不到它是在一个虚拟的环境中运行7。skyeye 可用来 协助开发人员开发、调试和学习系统软件。 vmware 是一个基于主机模型的虚拟 pc 软件,由 emc 旗下独立的软件公司 vmware 开发,支持在一台机器上同时运行多个 windows、linux 系统,多个操作系 统在主系统的平台上, 像标准 windows 应用程序那样切换, 每个操作系统互相独立、 互不影响8。 xen 是一个开放源代码虚拟机监视器, 由剑桥大学开发。 xen 支持在单个计算机 上运行多达 100 个满足特征的操作系统,不过操作系统必须进行修改移植以在 xen 上运行,用户的应用程序满足兼容性9。 kvm 是基于内核的虚拟机。最新的 intel vt(虚拟技术)和 amd svm(安全虚拟 机)从硬件上支持了虚拟技术, 试图取代准虚拟化技术。 kvm 在标准的 linux 内核中 增加了虚拟技术,从而可以通过优化的内核来使用虚拟技术。在 kvm 模型中,每一 个虚拟机都是一个由 linux 调度程序管理的标准进程10。 bochs 是一个开源的模拟 x86 环境的虚拟机, 相比其他虚拟机而言具有更好的可 移植性,可以运行在 x86,powerpc,alpha,mips 多个平台上。模拟环境中可以运 行 linux 和 windows 操作系统。bochs 采用解释执行每一条指令,运行效率较低11。 java 虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现,有 自己想象中的硬件,如处理器、堆栈、寄存器,具有自己的指令系统。java 虚拟机 屏蔽了与具体平台相关的信息,使得 java 程序编译产生的字节码可以不加修改的运 行在其他实现了 java 虚拟机的平台上,实现了 java 语言的平台无关性。java 虚拟机 在执行字节码时,把字节码解释成具体平台上的机器指令执行12。 1.3 虚拟机的分类虚拟机的分类 虚拟机的种类很多,可以根据计算机的抽象接口来给虚拟机分类。 3 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 应用软件 系统调用 用户isa 机器 abi 应用软件 操作系统 用户isa系统isa isa 机器 图 1.1 计算机接口 指令集体系结构(instruction set architecture,isa),如图 1.1 右,是软件与硬件的 分界,定义和控制硬件和软件之间的接口,包括用户指令集和系统指令集。用户指 令集是指令集体系结构中应用程序可见的部分。系统指令集是指令集体系结构中只 有操作系统这样的超级用户软件才能看到的部分,负责管理硬件资源。从系统的角 度看,机器由底层硬件实现,isa 提供了系统与机器之间的接口13。 应用二进制接口(application binary interface,abi),如图 1.1 左,提供程序访问 硬件资源和使用系统服务的能力。包括两个组件:一个是所有用户指令的集合,不 包括系统指令;另一个是操作系统的系统调用接口。从进程的角度看,机器由操作 系统和底层的用户级硬件组成,abi 提供了进程与机器之间的接口14。 e(si) 客户机 sisj e(si) 主机 sisj v(si)v(sj) 图 1.2 虚拟化的同态 形式上,虚拟化是一个同态结构,映射虚拟客户系统到一个真实的主机。如图 1.2,这个同态结构映射客户机状态到主机状态(函数 v) ,对于修改客户机状态的一 系列操作(函数 e 修改状态 si到状态 sj) ,在主机上有相应的一系列操作 e(修改 si 到 sj) 。虽然这个同态也能被用来描述抽象,我们区分两者:虚拟化不同于抽象在于 4 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 虚拟化不必隐藏细节,虚拟系统的细节通常与底层真实系统一样。 虚拟机通过真实机器和虚拟软件的结合来实现。 虚拟化的过程包括两个部分:(1) 映射虚拟资源或状态(如寄存器、存储、文件)到底层机器的真实资源; (2)使用 真实机器的指令和系统调用来实现虚拟机的指令和系统调用(如虚拟机 abi 或 isa 的仿真)15。 1.3.1 进程虚拟机进程虚拟机 一个进程虚拟机能够支持单一进程,如图 1.3 所示。在进程虚拟机中,虚拟化软 件被放置在 abi 接口,操作系统和硬件组合的上面。虚拟软件仿真用户级指令和操 作系统调用16。 应用程序应用程序 虚拟机 硬件 虚拟软件 操作系统 图 1.3 进程虚拟机 通常底层平台被称作主机,运行在虚拟软件中的应用程序称作客户机。与虚拟机 相应的被虚拟机仿真的真实平台被称作本地机。在进程虚拟机中,虚拟软件通常被 称作运行时(runtime) 。运行时被创建用来支持客户进程并且运行在操作系统上。虚 拟机支持客户进程只要客户进程执行,虚拟机终止直到客户进程终止。 1.3.2 系统虚拟机系统虚拟机 一个系统虚拟机提供了一个完整的系统环境。这个环境能支持一个操作系统和潜 在的用户程序。它提供客户操作系统访问底层硬件资源,包括网络、i/o 以及台式机 上的显示和图形用户界面17,虚拟机支持操作系统只要系统环境仍在运行。 5 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 应用程序 硬件 虚拟化软件 (vmm) os 应用程序 虚拟机 os 图 1.4 系统虚拟机 系统虚拟机见图 1.4,虚拟机软件被放置在底层物理机器和传统软件之间。在这 个特例中,虚拟软件仿真了硬件 isa 使得传统软件看到的是与硬件支持不同的 isa18,19。在很多系统虚拟机中客户机和主机运行相同的 isa。在系统虚拟机中,虚 拟软件通常被称作虚拟机监视器(vmm) 。 1.4 进程虚拟机的主要应用进程虚拟机的主要应用 进程虚拟机提供给用户应用程序一个虚拟的 abi 环境。在它们各种各样的实现 中,进程虚拟机提供复制、仿真和优化。 1.4.1 仿真器和动态二进制翻译器仿真器和动态二进制翻译器 进程虚拟机一个应用是支持编译采用的与主机硬件不同指令集的二进制程序, 如 在一个指令集的硬件上仿真另一个指令集。 图 1.5 描述了一个进程虚拟机仿真器的例 子, 应用程序被编译到源 isa, 但是硬件实现了一个不同的目标 isa。 在这个例子中, 客户进程和主机平台的操作系统是相同的,但是在其他情况下操作系统可能是不同 的,这个运行时系统使得为 windows 编译的 ia-32 二进制程序可以运行在运行 windows nt 的 alpha 硬件平台上20,21。 6 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 windows os 运行时 ia32 windows应用 alpha isa 图 1.5 进程虚拟机仿真器 最直接的仿真方法是解释,一个解释程序执行目标 isa 取指、解码、仿真单独原 指令的执行。这是个相对慢的过程,每条被解释的源指令需要数十条本地目标指令。 为了获得更好的性能,二进制翻译通常被用到。二进制翻译将源指令代码块转变 成执行等价功能的目标指令。转换的过程相当耗时,但是一旦指令块被转换,翻译 的指令可以被缓存并比解释更快的速度重复的执行。因为二进制翻译是进程虚拟机 最重要的特性,它们有时被称作动态二进制翻译器。 解释和二进制翻译有不同的性能特征22-24。解释有相对较低的启动开销,但是当 指令被仿真时消耗大量的时间。另一方面,二进制翻译有较高的初始开销,但是每 次重复执行时速度很快。因此,一些虚拟机组合剖析使用分阶段的仿真策略,如收 集关于程序行为的静态特性。初始时,一个源指令块被解释,使用剖析来决定哪个 指令序列经常被执行,然后经常被执行的块被二进制翻译。如果剖析显示代码块执 行频率高,有些系统还在翻译的代码上执行额外的代码优化25,26。在大多数仿真虚 拟机中,解释和二进制翻译同时发生在单个程序的执行过程。 1.4.2 高级语言虚拟机:平台独立性高级语言虚拟机:平台独立性 在传统的系统中,如图 1.6a,编译器包括一个执行词法分析,语法分析和语义分 析并生成中间代码的前端,中间代码与机器代码相似但更抽象,例如不包含特定的 寄存器分配。然后一个代码生成器将中间代码变成二进制代码,包含针对特定指令 集和操作系统的机器码27,28。二进制程序被分发并在支持指定指令集和操作系统组 合的平台上执行。为了将程序在一个不同的平台运行,程序必须重新编译。 在高级语言虚拟机中, 这种模式被改变了, 如图 1.6b。 它的步骤和传统系统类似, 不过程序以在一个更高层被分发。传统的编译器前端生成和中间形式类似的抽象机 7 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 器码,在高级语言虚拟机中,这是个相当普通的基于栈的指令集。虚拟指令集实质 上是这个虚拟机的机器码,这个可移植的虚拟指令集代码被分发,它能够在实现了 虚拟指令集的平台上执行29-31。最简单的虚拟机形式包含一个取指令、解码、执行 需要的状态转换(如存储和栈)的解释器,通过虚拟机定义的标准库函数来执行 i/o 功能。更复杂的高性能虚拟机利用二进制翻译将抽象机器码编译到主机机器码,来 直接执行到主机平台上。 高级语言程序 中间代码 目标代码 存储器映像 编译器前端 编译器后端 分发 加载器 高级语言程序 可移植代码 虚拟存储映像 主机指令 编译器 虚拟机加载器 分发 虚拟机解释器 a) 传统系统,分发的是依赖于 平台的目标代码 b) hll虚拟机环境,可移植的中间代码 在其内被依赖于平台的虚拟机运行 图 1.6 高级语言环境 1.5 虚拟机实现的相关技术虚拟机实现的相关技术 许多虚拟机基于仿真实现, 仿真是在一个具有不同接口和功能的系统或子系统上 实现一个特定接口和功能的系统或子系统的过程。指令集仿真是许多虚拟机实现的 关键,因为虚拟机必须在特定指令集的主机处理器上支持一个采用不同指令集编译 的二进制程序32。指令集仿真可以通过许多方法来实现,这些方法需要不同数量的 计算资源并提供不同的性能和可移植特性。 1.5.1 解码解码-分派解释分派解释 解释器有很长和丰富的历史,一些程序语言依赖于解释来实现33,34。这里主要考 虑将解释技术应用于二进制代码而不是高级语言。一个解释器程序仿真和操作在实 现了源指令集的完整结构状态的机器上,包括所有结构寄存器和主存。客户机主存 8 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 的镜像,包括程序代码和程序数据被保存在解释器维持的一块主存地区。解释器的 主存也维持一个称作上下文块的表,这个表包含源结构状态的各种组件,例如:通 用寄存器、程序计数器、条件码和控制寄存器。 一个简单的解释器操作源程序每次一条指令,根据指令来读取和修改源状态。这 样的解释器通常被称作解码-分派解释器, 它被组织称一个中央循环来解码一条指令, 然后分派它到这条指令的解释例程35,36。一个解释器的结构例子如图 1.7 所示,解释 器的主循环在图的顶部,解释例程在图的底部。主循环判断没有停止和中断发生, 然后根据 pc 在代码块 code 中取一条指令,提取指令的操作码部分,根据操作码再 调用相应的解释例程,解释例程根据指令的格式来提取出操作数,执行相应的运算, 并将结果保存在指定位置。 完了再修改 pc 指向下一条指令, 返回主循环, 开始取指, 这样循环下去。这样的解释器性能很差,每解释一条源指令集中的指令需要执行数 十条目标指令集中的指令。 while (!halt opcode = extract(inst,31,6); switch(opcode) case loadwordandzero : loadwordandzero(inst); case alu : alu(inst); case branch : branch(inst); . . . instruction function list loadwordandzero(inst) rt = extract(inst,25,5); ra = extract(inst,20,5); displacement = extract(inst,15,16); if (ra = 0) source = 0; else source = regsra; address = source + displacement; regs rt = (dataaddress 32; pc = pc + 4; alu(inst) rt = extract(inst,25,5); ra = extract(inst,20,5); rb = extract(inst,15,5); source 1 = regsra; source 2 = regsrb; extended_opcode = extract(inst,10,10); switch (extended_opcode) case add : add(inst); case addcarrying : addcarrying(inst); case addextended : addextended(inst); . . . pc = pc + 4; 图 1.7 解码 powerpc 指令集的代码 9 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 1.5.2 线索解释线索解释 解码-分派解释器很容易编写和弄懂,但是速度很慢。接下来我们介绍一些技术 来减少或消除一些低效,首先看线索解释。 解码-分派解释器的主循环包含一些直接和间接分支指令。依赖于硬件实现,这 些分支降低了性能,特别是在他们很难预测的时候。除了在循环顶部测试停止或中 断,在 switch 语句中有一个寄存器间接分支,解释例程的分支,从解释例程返回的 第二个寄存器间接分支,最后终止循环的分支。通过给每个指令解释例程的尾部添 加一部分分派代码,如图 1.9 所示,消除了刚才列举的三个分支37,38。剩下的分支是 寄存器间接分支,替代了主循环中的 switch 语句分支,为了解释下一条指令必须装 载下一条指令的操作码,在分派表中查找相应的解释例程的地址,并跳转到例程。 instruction function list loadwordandzero: rt = extract(inst,25,5); ra = extract(inst,20,5); displacement = extract(inst,15,16); if (ra = 0) source = 0; else source = regsra; address = source + displacement; regs rt = (dataaddress 32; pc = pc + 4; if (halt | interrupt) goto exit; inst = codepc; opcode = extract(inst,31,6); extended_opcode = extract(inst,10,10); routine = dispatchopcode,extended_opcode; goto *routine; add: rt = extract(inst,25,5); ra = extract(inst,20,5); rb = extract(inst,15,5); source 1 = regsra; source 2 = regsrb; sum = source1 + source2; regs rt = sum; pc = pc + 4; if (halt | interrupt) goto exit; inst = codepc; opcode = extract(inst,31,6); extended_opcode = extract(inst,10,10); routine = dispatchopcode,extended_opcode; goto *routine; 图 1.8 powerpc 代码的线索解释例程 就像刚才描述的,线索解释的一个关键属性是分派通过一张表间接地发生。这种 间接的优势是解释例程可以被独立的修改和重定位。因为通过分派表来跳转是间接 10 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 的,这种方法被称为间接线索解释39,40。 1.6 主要研究内容主要研究内容 本文采用理论研究和系统实现相结合的方式,对进程虚拟机进行了深入的理论 研究,同时设计并实现了一个进程虚拟机的模型系统 nano。 针对以上研究内容,本文具体章节安排如下: 第一章介绍了课题来源、目的与意义,并在国内外概况中介绍了常见的虚拟机。 再根据计算机系统抽象层次中不同接口将虚拟机划分为进程虚拟机和系统虚拟机两 大类,给出进程虚拟机的主要应用,对虚拟机的指令仿真的相关技术进行了介绍; 第二章设计虚拟机系统,包括:汇编语言的设计,翻译汇编源代码到字节码文 件的汇编器设计,解释执行字节码文件的虚拟机设计。设计中包含程序的主要组成 模块图和各模块执行的功能描述,并给出了程序的使用方法; 第三章实现虚拟机系统,实现中对组成程序的各个模块进行了更加深入的实现 细节描述,包括:处理流程图、数据结构定义和算法伪代码,同时对数据的处理过 程进行描述; 第四章测试并分析实现的虚拟机系统,编写测试用例程序分别验证汇编器和虚 拟机工作的正确性; 第五章是对现有工作的总结和未来研究的展望。 11 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 2 虚拟机系统设计虚拟机系统设计 通过前面相关的进程虚拟机的理论研究,下面开始设计进程虚拟机系统 nano。 nano 虚拟机系统与 java 虚拟机系统类似,只不过面向的不是高级语言。系统设计包 括对 nano 汇编语言、nano 汇编器及 nano 虚拟机的设计。 2.1 系统组成及工作流程系统组成及工作流程 nano 虚拟机系统由两个部分组成,nano 汇编器和 nano 虚拟机。系统的工作流 程如图 2.1 所示, nano 汇编语言是专门为 nano 虚拟机设计的面向机器的语言, 源程 序采用 nano 汇编语言编写,nano 汇编器将源程序翻译成特定格式的字节码可执行 文件,它在本地平台上不能直接执行,需要在 nano 虚拟机中使用。nano 虚拟机按 照源程序的逻辑,对字节码可执行文件里面的指令逐条解释并执行相应功能,完成 源程序所指定的工作。 字节码 可执行文件 nano 汇编器 源程序 nano 虚拟机 输入翻译加载 运行 直到退出 nano 汇编语言 编程 图 2.1 nano 虚拟机系统的工作流程 2.2 汇编语言程序设计汇编语言程序设计 nano 汇编语言是一种程序设计语言,它直接把符号化的助记符映射为 nano 虚 拟机的机器指令,机器指令和助记符之间的映射结果几乎是一对一的关系。机器指 令是纯二进制形式,只能为机器识别,程序员无法直接阅读和编写,nano 汇编语言 提供的这层映射机制使程序员阅读和编写程序变得尤为方便。 下面将简单介绍 nano 汇编语言定义的不同类别的操作: (1)基本操作 nano 虚拟机是基于寄存器的,分别有 32 个长整型寄存器和 32 个双精度浮点数 寄存器。如果对数字进行操作,首先需要将数字移入寄存器,可以将常量或变量移 入寄存器。移动常量或变量到寄存器可以通过 push_i、push_l、push_d 操作,后缀 i、 l、d 分别表示短整形、长整型、双精度浮点型类型的操作数。相反,移动寄存器的 12 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 值到变量可以分别通过pull_i、 pull_d操作。 移动寄存器的值到寄存器可以通过move_l 和 move_d 操作。表 2.1 列举了几种操作。 表 2.1 基本操作举例 操作 功能 push_i 10, l0; 将常数 10 赋值给寄存器 l0 pull_i l0, x; 将寄存器 l0 的值赋值给变量 x move_l l1, l2; 将寄存器 l1 的值赋值给 l2 byte b; 定义字节变量 (2)控制台输入/输出 为了在控制台上打印信息,可以使用 print 操作符。print_s 用来打印操作数指定 的字符串,print_n 用来打印操作数指定数量的换行符。相反,为了从控制台读数据, 可以使用 input 操作符,input_s 用来读字符串输入到指定的操作数变量。表 2.2 列举 了控制台操作的例子。 表 2.2 控制台操作示例 操作 功能 print_s hello world!; 输出字符串常量到控制台 print_n l1; 输出寄存器 l1 个换行符到控制台 input_s n; 从控制台输入字符串到变量 n (3)预处理 在前面的例子中,使用寄存器是通过使用直接的寄存器名像“l0” 。这对简单的 程序来说可能行的通。但是当程序变得很大时,将很难记得寄存器“l0”是用来干 什么的,这种情况下可以使用预处理操作“#setreg”来给寄存器定义意义明确的别 名。有时,需要在程序中包含一个类似头文件的汇编文件,可以通过“#include”来 达到这个目的。表 2.3 列举了预处理操作的例子。 表 2.3 预处理操作示例 操作 功能 #setreg_l l0, null; 给寄存器 l0 设置别名为 null #include ; 将头文件 head.nah 包含到程序中 #setsepar |; 设置分隔符为字符| 13 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 (4)程序流程控制 一般情况下程序指令按照顺序从上往下依次执行,但有时也需要改变程序执行 的流程。程序流程可以通过跳转操作和子过程调用来控制,跳转进一步分为无条件 跳转和有条件跳转。跳转操作可以使程序跳转到指定标签处的指令去执行。子过程 调用使程序执行某个特定的函数功能,完了再返回到调用处的下一条指令执行。子 过程调用有时需要传递参数和返回值,可以通过栈来实现。示例如表 2.4 所示。 表 2.4 程序流程控制示例 操作 功能 jmp label; 跳转到 label 标签 jmp_l l, label; 如果l为真,跳转到 label eq_jmp_l l1, l2, label; 如果l1和l2相等,跳转到 label jsr label; 跳转到子过程 label 标签 rts; 从子过程返回 stpush_l l; 将寄存器l压入栈 stpull_l l; 从栈中弹出值到寄存器l (5)数学运算 数学运算主要包括算术运算、关系运算、逻辑运算和常用的数学函数。算术运算 用于各类数值运算,包括加、减、乘、除、自增、自减操作。关系运算用于比较运 算,包括大于、小于、等于。逻辑运算包括与、或、非。如表 2.5 所示。 表 2.5 数学运算示例 操作 功能 add_l l1, l2, l3; l3=l1+l2 inc_l l; l+ and_l l1, l2, l3 l3=l1 /memptr 指针指向源代码某行的内容 s2 line_len; /line_len 表示源代码某行的长度 s4 srcline; /srcline 表示该行在源代码中的行数 ; 22 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 struct jumplist /jumplist 结构用来保存汇编源代码中的标签信息 u1 islabel; /islabel 用来指示标签是否已定义 u1 labmaxjumpname + 1; /lab 字符数组保存标签的名字 s4 pos; /pos 用来指示标签处指令的位置 ; 开始 argc=2argv1=”?” y y 显示帮助信息并 退出 argc9 n y 拷贝argv1到 source数组 n n argc2 y i=2 i2 y i=2 i vmreg.larg2) epos = arg3 - 1; exe_next(); 40 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 子过程调用在修改程序计数器为参数指定的跳转目标位置之前, 需要先对当前的 指令计数器进行保存,以便子过程执行完毕时可以返回到调用处的下一条指令。由 于子过程可以嵌套调用,我们采用了一个类似栈结构的数据类型来保存程序计数器。 struct jumpreclist s4 pos; ; struct jumpreclist jumpreclistmaxjumpreclen; s4 jumpreclist_ind = -1; 如上所示,struct jumpreclist 结构用来保存程序计数器,通过定义一个数组可以 保存嵌套调用的多个调用处的程序计数器,通过定义一个数组的下标索引变量来保 存嵌套调用的层数。 子过程返回用来退出子过程调用,返回到调用处的下一条指令执行。通过弹出上 面栈结构的头元素来给出调用处的程序计数器,修改当前程序计数器,然后调用 exe_next 来执行下一条指令。 (5)系统调用操作 在虚拟机指令集中提供了许多类似系统调用的指令操作,包括:计时器操作、 进程操作、文件操作、套接口操作。这些系统调用使用了前面提过的系统变量、文 件描述字、套接口描述字等数据结构来保存数据,操作通过主机平台提供的系统接 口调用来实现,我们对其做了一层简单的封装,这样便达到了系统调用的仿真效果。 由于系统调用的种类繁多、实现代码过于复杂,这里不再细述,上面的输入输出操 作也是系统调用操作的一种,只不过相对其它操作来说简单一些。 3.3 本章小节本章小节 本章结合 nano 虚拟机系统的设计方案,对 nano 虚拟机系统的实现细节进行了 分析和描述。nano 汇编器翻译源程序时分别进行参数处理、初始化、源代码加载、 预处理、翻译、标签处理、生成字节码的过程。nano 虚拟机执行字节码文件时分别 进行命令行参数处理、构建运行环境、字节码验证、指令执行的过程。 41 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 4 测试与分析测试与分析 在系统设计并完成实现之后,对系统进行测试和分析是很重要的一个环节,一方 面确认系统做了期望的事情,另一方面确认软件以正确的方式做了这个事情。本章 对 nano 虚拟机系统的测试和分析进行详细论述。 4.1 测试平台及方法测试平台及方法 (1)测试平台 考虑到 nano 虚拟机系统通过将虚拟平台的字节码指令最终转化成主机平台的 x86 指令集执行来实现字节码指令的功能,测试平台选择的是普通的 pc 机。由于 nano 虚拟机系统使用标准 c 语言和标准库函数实现,所以 nano 虚拟机系统具有较 好的移植性,测试系统可以是 windows 操作系统或 linux 操作系统。 (2)测试方法 首先分别在 windows 操作系统和 linux 操作系统对 nano 汇编器程序和 nano 虚 拟机程序进行编译,生成目标平台的二进制可执行文件。注意:汇编器生成的字节 码可执行文件具有跨平台的特性,可以在任何实现了 nano 虚拟机的平台解释执行, 这也是需要分别在 windows 系统和 linux 系统编译 nano 系统的原因。 接着编写 nano 汇编源程序,也就是测试数据,使用 nano 汇编器对源程序进行 汇编,得到 nano 虚拟机将要运行的字节码可执行文件,这里需要测试 nano 汇编器 的正确性,即生成的是与源程序对应的正确字节码文件。为了确保 nano 汇编器能够 正确汇编各种语句,需要编写许多汇编源程序,对不同类型的操作语句分别进行测 试。 最后通过 nano 虚拟机运行 nano 汇编器生成的字节码文件,检查 nano 虚拟机 是否完成了汇编源程序的逻辑功能,来测试 nano 虚拟机执行字节码文件的正确性。 同样,为了确保 nano 虚拟机能够正确解释各种字节码指令,需要生成各种字节码文 件,这可以通过上一步测试 nano 汇编器的正确性时得到。 4.2 测试数据及分析测试数据及分析 (1)测试用例一 42 华华 中中 科科 技技 大大 学学 硕硕 士士 学学 位位 论论 文文 如图 4.1 所示,该汇编源程序是经典的“hello world”程序。第一行将 0 赋值给 寄存器 l0,用来退出时返回给虚拟机指示程序正确执行。第二行将 1 赋值给寄存器 l1。第三行在终端上打印“hello world”字符

温馨提示

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

评论

0/150

提交评论