分享

[论文]基于C++的虚拟机构造技术及其编译系统的研究与设计 (小型篇)

 quasiceo 2013-12-07
分类: 我的工作 2007-02-24 22:21 1373人阅读 评论(0) 收藏 举报
 

基于C++的虚拟机构造技术及其编译系统的研究与设计

计算机科学与技术    朱德伦

            于永彦

摘要:虚拟机是模拟目标抽象机的一种技术。根据抽象机的技术规格,利用软件开发技术实现通过软件模拟抽象机的运行机制,达到理想的计算机运行时环境。特别是对于特定的技术领域需要时,虚拟机技术能够发挥更大的作用和良好的效果。在本文中,对虚拟机技术本身、基于虚拟机的汇编程序设计语言及其编译器的研究、设计与实现进行简要的探讨。并给出一套基本的虚拟机运行时环境模型和开发工具。

关键词:虚拟机  面向对象程序设计技术  内存管理技术  编译原理

1  引言

虚拟机技术早在上世纪的六七十年代就已经出现了。在软件开发领域中,有很多的开发技术是属于只有少数人才能够掌握的,包括操作系统开发、编译器开发等很多的软件技术。谈到操作系统,相信有很多立志在计算机软件领域有所作为的人们都曾经有过想开发自己的操作系统的冲动,这种感觉驱使着一代又一代的准程序员们不断的学习与进步,不断的研究与探索着。但是,因为操作系统开发的涉及到了很多的领域,所以,这令很多人都望而却步。在这个领域中,有一项技术在操作系统开发的过程中起到了至关重要的作用,这就是虚拟机技术。

面对规模不断扩大而又异常复杂的软件系统和日新月异的软件开发技术的发明,软件工程师们开始重新审视虚拟机技术的优势了。

使用虚拟机技术就可以从一定程度上避免此类事情的发生。当我们遇到计算机平台升级或者干脆出现了一种新的硬件平台时,我们惟一所要做的就是针对这个硬件平台移植我们的虚拟机系统本身,而对于过去建立在这虚拟机系统平台之上的应用程序而用不着做任何的改动,或者做一些小的升级就可以了。

对于那些正在使用某种商业化运行时系统(RTS,Run-time System)并已经在几种平台上开展过移植工作的软件开发人员来说,虚拟机技术给我们带来的节省与方便是非常明显的。比如Sun Java VM系统。

miniVM虚拟机及其编译器系统主要使用了面向对象程序设计技术、计算机体系结构和编译器技术。采用的是Microsoft Visual C++ 6来实现虚拟机系统本身,并使用Borland C++ Builder 6来实现基于虚拟机系统的汇编程序设计语言。

2  虚拟机技术原理

2.1 内存管理

按照冯·诺伊曼理论建立起来的计算机系统中,内存管理的重要程度随着计算机技术的不断发展变得越来越重要了。越来越多的计算机硬件和软件在设计过程中都把内存管理看成是整个设计过程中的重中之重。

内存为计算机提供了一种信息存储的方法。按照速度由快到慢,存储器设备可以分为:

a)      处理器中的寄存器

b)      处理器中的缓存

c)      随机存取存储器(RAM,Random Access Memory)

d)      只读存储器(ROM,Read Only Memory)

e)      本地磁盘存储器

f)      远程网络磁盘存储器

其中,随机存取存储器被称为计算机中的主存或内存,在数据存储系统中起到了承上启下的作用。内存成为程序运行与数据的存储的主要场所。

其中,计算机对内存的管理可以分为三个级别:

a)      机器级别

b)      操作系统级别

c)      应用程序级别

为了保证miniVM虚拟机系统的移植性,整个系统在设计的时候,就考虑使用完全软件的方式来管理虚拟机自己的内存空间。

miniVM在一开始启动的时候,会向宿主操作系统系统申请一段内存空间,然后将这一段分配得到的线性内存空间构造出一个人工设定的地址空间来给基于miniVM虚拟机运行时环境的应用程序在运行时使用。这个人工的地址空间将被分成三段:一个正文段(text segment)、一个数据段(data segment)、一个堆栈段(stack segment)。

2.2 中央处理器设计

针对不同类型的中央处理器可以设计出不同的计算机系统:基于堆栈或者基于寄存器的计算机。在日常生活中使用的Intel Pentium芯片是属于基于寄存器的中央处理器系统。

而基于堆栈的中央处理器一般都运用于嵌入式设备的系统中,由于这些设备的物理性能的限制,必须使用基于堆栈的中央处理器。比如对一个简单的加法指令,在基于堆栈的处理器中,将会从堆栈中弹出两个操作数并进行运算,然后将运算的结果重新压入堆栈。这样,同样一个简单的运算,在基于寄存器的处理器中,这条加法指令最起码需要三个单位长度的内存空间,而在基于堆栈的处理器中,一个单位的内存空间就足够了。所以,针对基于堆栈的处理器编译的可执行程序版本要比基于寄存器处理器的版本要小得多。

由于堆栈本身就是很适合于函数调用操作,所以在运行期间,基于堆栈的处理器在上下文切换时的开销也很小。而对于基于寄存器的处理器可就没有那么幸运了,处理器必须在上下文切换之前,将所有重要寄存器中的数据保存起来,即保护现场。保护现场操作本身就是一个很消耗内存,耗费时间的事情。

虽然基于堆栈处理器存在很多的优点,但是其速度还是比不上基于寄存器的处理器。因为在片上寄存器(Cache On-pie)中进行运算的速度非常之快的,特别对Intel新一代的中央处理器来说,上面设计了更多的寄存器,便于提升数据操作的速度和数据的吞吐量。而相反,虽然基于堆栈的处理器在切换上下文时的开销很小,但是往往其堆栈会开辟到内存空间中去。所以,事实上这种处理器的数据操作更多的是对内存空间的操作。

根据上面对两类不同的处理器类型以及在性能方面的初步分析,miniVM的设计将在面向堆栈和面向寄存器的处理器体系结构中作一些折衷的选择。

miniVM的所模拟的“处理器”总体上是基于寄存器的,即miniVM拥有若干个寄存器。但与此同时,在miniVM的内存空间中的顶部同时也存在一个小型的堆栈,以方便实现应用程序的上下文切换。

miniVM虚拟机系统的“处理器”中设计了24个32bit的寄存器,其中分为以下的几类寄存器:

a)      8个系统寄存器,包括:5个段寄存器_BE、_HS、_HE、_SS、_TOP,以及3个指针寄存器_IP、_SP、_FP;

b)      8个通用寄存器,同时也是整型寄存器;

c)      8个单精度浮点寄存器。

3  虚拟机系统的可行性分析与功能需求

3.1 可行性分析

目前,我们已经步入了信息时代、知识爆炸的时代。对各种不同信息在不同平台之间的无缝交换,已经成为迫切的需要。人们并为此花了大量的时间、金钱和人员,但是收效不佳。而在过去用来开发操作系统时所使用的虚拟机技术却重新得到了人们的注意,在做了必要的改变之后,虚拟机技术进入了第二春。

因为虚拟机技术有比较长的历史,所以技术上已经非常成熟。即使在现代信息系统运用中,需要运用更多的新技术来适应新的功能需求。但在技术上,对虚拟机平台的实现还是可能的。

在经济上,开发一整套的虚拟机系统时所需要的费用并不是非常的高昂。对于小型的虚拟机系统来说,整个开发周期并不长,一般都是2至5个人年。

从社会层面来说,整个系统的社会需求量在随着社会的进步,而不断的扩大。应该说,市场前景乐观。

另外,从民族工业角度来看,拥有自行研制的开发平台一直都是每一个软件人的理想。可以说,拥有了开发平台的核心技术就等于拥有了明天的市场。

3.2 系统需求

构造整个虚拟机系统及其编译器系统的主要目标包括:

d)      实现对抽象机的处理器的模拟功能

e)      实现虚拟机系统的可视化界面

f)      建立一个虚拟机自身的汇编程序设计语言mASM

g)      根据汇编程序设计语言的语法结构,建立一个可视化编译器系统Visual Assembly Studio

h)      建立一整套的软件开发平台的规范

在虚拟机系统功能方面的需求主要体现在以下几个方面:

a)      实现目标抽象机的处理器的基本运算功能;

b)      对模拟处理器的数据流的输入与输出功能;

c)      对建立在虚拟机平台之上的应用程序实现人机交互;

d)      开发编译器系统,实现对汇编程序的编辑、编译和调试;

e)      虚拟机系统自身实现调试模式(功能包括单步执行、反汇编等);

根据上面对虚拟机技术功能方面需求分析中,可以看出在整个虚拟机系统中,包括了以下几个主要部分:

a)      基于图形系统的虚拟机系统;

b)      基于虚拟机系统的汇编程序设计语言;

c)      基于虚拟机汇编程序设计语言的可视化编译器系统。

虚拟机系统本身的作用是模拟一台计算机处理器的工作运行方式,实现对客户运用程序的功能实现;基于虚拟机系统的汇编程序设计语言主要是用来实现客户的需求实现;基于汇编程序设计语言的可视化编译器系统则是实现把用户逻辑转化成实际的应用程序。

4  系统的功能及结构

4.1 系统总体结构图

整个虚拟机系统平台中,用户通过可视化编译器系统,编写符合自身业务需求的应用程序。并且使用可视化编译器对源程序进行编译、修改,并生成可执行字节码文件。该可执行文件就可以在虚拟机平台上运行,达到实现用户自身业务需求的目的。系统总体结构如图4-1所示。

 

 

 

 

 

 

 

 


4-1 系统总体结构框图

4.2 miniVM虚拟机系统的实现技术

本系统利用面向对象程序设计技术来实现虚拟机系统及其编译器系统。运用了执行引擎技术、模块化系统设计技术、流绑定技术和异常处理机制。

4.2.1 执行引擎

为了能够做到该系统能够在各个系统之间有高可移植性,系统设计过程使用了执行引擎技术,将所有核心的功能模块封装在一个主要的模块中,并且使用的标准的C++程序设计语言,做到了平台无关性。

4.2.2 流绑定技术

由于虚拟机的执行引擎处在软件系统底层,这样给虚拟机与外界的数据交换带来了不便。因此,在执行引擎与图形界面之间,加入了一个专门管理数据流的输入/输出工作。这个技术的运用加强了系统的移植性方面的要求。

4.2.3 异常处理机制的运用

同样是因为虚拟机系统执行引擎深处于软件系统的底层,当系统出现各种各样的状况时,无法及时地反映给用户,特别是当功能深陷于代码之中时,能够及时地反映系统状态变得特别重要。因此,在本系统中使用的C++程序设计语言的异常处理机制来弥补这一方面的不足。

4.2.4 miniVM虚拟机的运行流程

因为虚拟机系统启动时需要一些必要的参数,所以系统使用了命令行启动方式。虚拟机系统启动之后,分析并记录参数中的数据。接着初始化虚拟机环境,并开始读入客户应用程序中包含的机器指令。接下来就是执行刚才读取的机器指令,并将已经得到处理的信息返回给用户。然后,在一次读取下一条指令,直到遇到停机指令后系统退出。其主要的流程如图4-2所示。

4.3 可视化编译器的实现技术

编译器本身的用途就是把一个程序设计语言源代码翻译成一种目标计算机能够理解的可执行程序文件。所以,miniVM虚拟机的汇编语言编译器需要对符合miniVM汇编语言文法的汇编源代码文件中的文本进行遍历和分析。而遍历的遍数则是根据源语言的复杂程度来决定的。把汇编语言翻译成可执行字节码文件需要总共3个步骤,其中有两次源代码遍历过程:

其第一遍使用来确定地址,即一个地址分析的过程:

a)        获得一个标示符。

b)        确定该标示符的指令地址。

c)        如果在符号表中没有相关记录时,将地址保存到符号表中。

 

 

 

 

 

 

 

 

 

 

 

 


4-2 虚拟机系统流程图

1)      把标示符的文本信息保存的字符串表中。

2)      把标示符的元数据(metadata)保存到符号表中。

3)      把标示符添加到散列表中,以作为以后遍历过程中的索引之用。

d)        如果没有达到文件尾部,回到步骤A。

e)        返回。

而第二遍遍历将利用由第一次遍历时搜集得到的地址信息,翻译源程序并生成与源程序具有相同语义字节码代码:

a)     获得一条指令。

b)     检查指令中是否存在标示符。

1)      若存在标示符,从散列表中查询出该标示符在符号表中的信息。

2)      根据查询得到的信息,检索符号表里关于标示符的信息,包括地址。

3)      把标示符替换成查询得到的标示符地址。

4)      若不存在标示符,跳到步骤C。

c)     把刚才的指令翻译成字节形式的机器指令。

d)     如果没有到达文件尾部,回到步骤A。

e)     返回。

由上面的算法可以看出,编译器对源程序中各种标示符的信息搜集、符号表的管理要做大量的工作,这也是整个编译器系统的难点和复杂的地方。

4.4 可视化编译器的体系结构

根据上面阐述的编译器系统的运行方式,分析得到其体系结构,如图4-3所示。由图中可以明显的看出看出每一次对源程序的遍历过程都是需要对符号表进行添加和查询操作。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


4-3 可视化编译器的体系结构

5  系统的开发环境及使用方法

5.1 系统的开发环境

本系统使用的Microsoft Visual C++ 6和Borland C++ Builder 6软件开发平台,以标准C++程序设计语言作为主要的开发语言,根据面向对象程序设计思想为主要的系统设计思路。按照冯·诺伊曼机的体系结构来设计虚拟机系统。

该系统的开发过程中,主要的难点是在于目标抽象机处理器的设计、汇编程序设计语言的研究与设计、兼容虚拟机平台的可执行文件的文件格式的研究与设计、可视化编译器系统的研究与设计等,应该说,整个工程难度不小。

5.2 系统的使用方法

准确地说,本系统是一个比较完整的软件开发环境,用户可以利用miniVM虚拟机系统自身的汇编程序设计语言,并按照虚拟机系统软件开发规范来开发实现自己的业务需求。利用系统中提供的可视化编译器系统编译该客户应用程序,生成能够在miniVM虚拟机系统上运用的可执行字节码文件。在这个可执行字节码文件中,包括了应用程序中能够实现客户需求的功能代码和数据,这些代码和数据都是以字节码的形式存在于可执行文件里的。最后使用命令行参数将编译好的可执行文件传给虚拟机系统并执行之。用户可以在miniVM虚拟机的图形界面中看到应用程序执行的结果。

6  结论

通过这次对虚拟机系统的理论研究和设计,对Visual Studio 6和Borland C++ Builder 6全新的认识,并利用研究得到的技术结论研发出了一个比较完整的软件开发平台。应该说,整个系统的构造完整,充分体现了面向对象程序设计技术的理论精髓以及在软件开发方式方面的技术优势。

在系统设计过程中,对所选课题涉及到的相关计算机理论知识有了一个全方位的认识。应该说,这次系统开发过程是笔者个人几年学习历程的一次总结。

本系统基本实现了任务书所提出的要求,对虚拟机构造技术及其编译器系统的设计技术等多方面的知识有了充分的技术体现。当然,不尽人意之处在所难免,有许多地方还有待改善。希望大家不吝指正。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多