关闭

64位虚拟机SPANVM的设计与实现

标签: 虚拟机语言跨平台汇编平台system
917人阅读 评论(0) 收藏 举报
分类:

64位虚拟机SPANVM的设计与实现

刘黎明1,王昭顺1

1. 北京科技大学信息工程学院计算机系,北京 100083

摘要:跨平台软件开发和多语言程序设计是当前软件开发中的两个难题,SpanVM是一个基于寄存器和堆栈混合模型的64位运行时系统,凡是符合SpanVM规范的可执行字节码文件都能在移植了该虚拟机的平台上被该虚拟机执行。介绍了如何设计一个实用的虚拟机系统,包括SpanVM的内存模型、处理器设计、I/O机制和运行时过程,并以SPANVM为基础探讨了跨平台和多语言程序设计的解决方法。

关键词虚拟机,运行时,内存管理,处理器

中图分类号TP311

Design and Implement of 64-bit Virtual Machine SPANVM

LIU Li-ming1WANG Zhao-shun1

(1.School of Information Engineering , Univercity of Science & Technolegy of Bejing, City Zip Code100083, China)

AbstractSpanvm is a 64-bit runtime system based on register and stack ,is a environment for program to execute in.It provide all things needed to run a program. It can execute all bytecode files according with spanvm specification.Introduce how to design a practical virtual machine system,include SpanVM’s memory modelprocesserI/O and running course, and put forward a scheme resolving multi-OS and multi-language programing.

Key words: virtual machineruntime invirenmentmemory managing, processer

 

1 序言

   SPANVM的处理器设计

绝大部分应用程序受开发工具的限制,只能在特定的操作系统平台上运行,限制了应用程序的适用范围,而开发人员要使应用程序能在不同硬件平台不同操作系统上运行,需要对程序代码做很多修改甚至重新开发。这就引起了软件移植问题。

软件开发人员在开发一个系统时,往往不同的开发人员使用的开发语言不同,而且不同的语言有各自的特点和优势,一个系统往往需要利用不同语言的优势提高软件的性能或减小开发代价,但各种不同的语言混合编程很不方便。这就引起了多语言程序设计问题。

软件移植和多语言程序设计这两个问题的解决过程中了跨平台和多语言程序设计的需求,设计SPAN虚拟机(以下简称SPANVM)为跨平台和多语言程序设计做出了有益的探索和研究。

2 SPANVM虚拟机

机器是能存贮和执行程序的算法和数据机构的集合体。广义的虚拟机就是虚拟机器。由硬件或固件实现是实际机器。实际机器级以上的所有机器都可以称为虚拟机,它们是由软件实现的机器。从计算机系统结构方面的分析来讲,软硬件的功能和逻辑上是等价的,也就是说,从上一级使用者的角度看,虚拟机等价于实际机器。

 

虚拟机首先是一个模拟器它用一套指令系统所代表的一种计算机系统结构模拟了另一种指令系统所代表的一种计算机系统结构,它还是一个运行时系统,不同层次的虚拟机器都会形成不同级别的运行时系统,运行时系统则要提供程序在执行时所需要的一切东西。虚拟机是提供类似于实际机器功能的一个软件程序,它会像实际机器那样取出并执行程序指令,只是虚拟机的指令执行过程发生在软件级而不是硬件级,即指令是由软件而不是硬件执行的。

SPANVM是一个运行时系统。运行时系统是程序得以执行的一个环境,要提供程序在执行时所需要的一切东西。例如,运行时系统要负责为应用程序分配一定的内存空间,把该应用程序的各部分加载到分配好的内存空间中,然后开始执行该程序中的指令。如果该程序通过调用系统调用要求位于底层的操作系统提供服务,该运行时系统还必须负责出处理有关的服务请求。例如,如果应用程序需要进行文件I/O操作,运行时系统就必须向它提供一种与磁盘控制器进行通信并提供读/写访问的机制。

SPANVM设计目标是可移植性、可理解性和高性能,并且在设计和实现上具有如下特点:1) 简单、灵活、直观的指令系统;2) 简单快速的执行模式以及响应机制;3) 丰富而高效的输入输出功能;4) 运行安全,规模适中

 

 

基于堆栈的处理器的优点是内存开销比较小、函数调用比较快、进程切换比较快,缺点是基本操作比较慢。基于寄存器的处理器基本操作比较快(正题性能更好),执行过程比较透明(易于调试),缺点是上下文切换消耗大量内存、调用函数时需要处理很多事务。

SPANVM处理器基于堆栈和寄存器的混合模型设计,SPANVM处理器有6464位寄存器和1032位寄存器。这些寄存器分为:

5个段寄存器(R[BE]R[HS]R[HE]R[SS]R[TOP];

3个指针寄存器(R[IP], R[SP], R[FP];

24个通用型整数寄存器(R[R1]-R[R24]);

32个双精度IEEE754浮点寄存器(RD[D1]-RD[D10];

10个单精度IEEE754浮点寄存器(RF[D1]-RF[D10];

段寄存器用来把地址空间划分为不同的内存段。正文段总是从地址0开始,结束地址保存在R[BE]里。数据堆段的启示和结束地址分别保存在R[HS]R[HE]。堆栈段的起始和结束地址分别保存在R[SS]R[TOP]里。

SPANVM虚拟机运行期间,R[IP]寄存器保存即将执行的下一条指令的第一个字节在虚拟机内存系统中的地址,R[SP寄存器保存着堆栈的当前栈顶在虚拟机内存系统地址。R[FP寄存器用来定义“过程框架”,虚拟机在函数调用时从堆栈里临时分配一些内存来记录函数的调用情况。

SPANVM虚拟机启动时对5个段寄存器初始化。R[IP]被置为零, R[FP]也是零, R[SP]的值与R[TOP]相等。其余寄存器则用来保存运算时的数据。64位寄存器 RD[R1]RD[R24]存放整数值。32位寄存器R[F1]R[F10]存放单精度IEEE754浮点数。64位寄存器RD[D1]RD[D10]存放双精度IEEE754浮点数。

根据内存体系的设计,SPANVM虚拟机的寻址方式可以分为立即数寻址、寄存器直接寻址、寄存器间接寻址、堆栈寻址。

在指令系统方面,CISC(复杂指令集)结构出现得较早。在这种结构中,新功能的增加主要靠增加新的指令,但为了保持向下兼容,就必须保持原有的指令;每条指令都有不同的操作指令码,对应不同的数据类型和位置,这样就造成了系统具有较大的指令系统和复杂的寻址技术,指令格式也很不规范。 而RISC(精简指令集)结构则采用定长指令,使用流水线的方式执行指令。这种结构大量利用寄存器间的操作,大大简化了处理器的结构,优化了VLSI器件的使用效率,同时功耗较低。与CISC处理器相比,RISC处理器的突出特点是只用硬件实现最常用的指令,其他指令通过微代码软件来模拟实现,通过简短的定长指令提高并行度。这样虽然硬件设计较简单,但处理器指令的逻辑设计反而复杂了。

现在的微处理器设计中,在高性能和高复杂度的压力下,CISCRISC早已互相借鉴,互相融合。但是,由于SPANVM虚拟机是纯软件实现,很多性能和复杂度问题都不存在了,设计的出发点倾向于可理解性,较多地采用了RISC结构的思想:1,选择一些使用频度较高的指令构成指令系统;2,使用几种简单的寻址方式;3,使用大量的寄存器。也是基于可理解性,操作码的表示没有优化,常用的三种编码方式定长二进制编码、扩展操作码编码、全哈夫曼编码中,SPANVM虚拟机使用定长二进制编码。

SPANVM虚拟机指令的操作码是固定的一字节长,而操作数从03个不等。

指令执行由run()函数来控制:

void run(){

   while( MEM[R[IP]] != HALT){

switch MEM[R[IP]]{

   case ADD:...break;

   case INT:RunINT();break;

   ...

   default:error();break;

}

R[IP]指向下一条指令的地址

}

}

4 SPANVM的内存管理

内存提供了一种存储信息的方法。SPANVM虚拟机在启动时一次性从宿主操作系统申请足够的内存供虚拟机来执行可执行程序,虚拟机访问所申请到的内存时,不存在速度差别,也不存在内存容量不够的问题,因此 SPANVM的内存管理不存在主存和高速缓存的结构,也不存在虚拟存储器和分段分页的结构。

为了使SPANVM虚拟机的二进制代码能在不重新编译的情况下在不同的硬件平台上执行,把SPANVM虚拟可执行文件的数值编码统一为降序格式。如果给定平台使用的是升序格式,则有关程序指令在解码和运行前必要的转换工作由SPANVM运行时系统负责完成。

SPANVM虚拟机在启动时向宿主操作系统申请内存,然后用分配到的内存构造一个虚拟地址空间供单个SPANVM应用程序使用。这个地址空间分为四个内存段:数据段、正文段、数据堆段、堆栈段。它们在内存中的位置如图1所示。

1 SPANVM的内存划分

       数据段存储的是各种全局性数据,它们都是在编译时确定下来的。

正文段的长度在编译过程中确定,堆栈和数据堆的长度在运行中是可变的。SPANVM的命令行选项能够设置堆栈和数据堆的长度。而SPANVM在初始化时把数据堆的长度设置为固定值,可以预防SPANVM虚拟机把宿主操作系统的资源无限制占用,从而确保SPANVM本身出现问题时,不会导致宿主操作系统出现内存泄露。

SPANVM对是否有超出堆栈段或低于正文段的内存引用现行进行运行时检查。同时还会检查堆栈段的运行时分配情况,即不能让它向下溢出到数据堆里,也不能让它向上溢出栈顶而进入到宿主操作系统没有分配给SPANVM的地址空间中。

对于SPANVM数据堆的管理,采用简单而有效的基于顺序匹配算法的内存管理技术。SPANVM地址空间里的数据堆段是字节码程序在其执行过程中动态使用的内存仓库。SPANVM的数据堆内存分为分配内存块和已分配内存块,每个内存块都与其前后内存块相链接(第一个内存块没有前内存块,最后一个内存块没有后内存块)。每个数据堆内存块被划分为4个区段:前一个内存块地址(8字节),后一个内存块地址(8字节),该内存块状态值(1字节),该内存块内容。每个内存块的前三个区段组成17字节长的表头,便于内存管理代码遍历所有的内存块来分配和释放内存。

数据堆初始状态是一个大的连续的未分配内存块,它的前、后内存块地址都为零,表示它的前后没有其它内存块。当内存管理代码需要分配内存的时候,它将到数据堆内存块列表里去寻找能够满足本次内存分配请求的第一个未分配内存块。这就是所谓的“最先匹配”内存分配策略。接下来,如果这个未分配内存块足够长,内存管理器就把它分裂为一个以分配内存块和另一个未分配内存快;否则,内存管理器把这个内存块直接标记为“已分配”。

如果内存管理器没有找到一个足够大的内存块来满足本次内存分配请求,它就返回地址0。而地址0时虚拟机字节码段的第一个字节,与数据堆相隔很远,即表示本次内存分配操作失败。当内存块被释放的时候,它表头里的状态区段将从“已分配”被改为“为分配”,并且需要把该内存块与它前、后的未分配内存块合并到一起。

5 SPANVM虚拟机的I/O机制和外设

真实机器的I/O操作与硬件的关系极其紧密,而让SPANVM虚拟机直接与硬件打交道,将使SPANVM虚拟机依赖于具体的硬件,会给可移植性带来意想不到的复杂性。宿主操作系统的系统调用(或者汇编语言)也可以实现I/O功能,速度也比C库函数快,但这样做的话,同样会使SPANVM虚拟机的实现依赖某种操作系统。因此,基于可移植性和可理解性的考虑,SPANVM虚拟机的I/O功能尽可能以C语言头文件stdio.h里的函数为基础以中断的形式实现。

SPANVM的中断系统除实现I/O功能外,还负责文件管理、进程管理、时间/日期管理、动态内存管理、数学函数、进程间通信等功能的实现。这些功能由INT n指令来实现,n代表中断类型,在指定寄存器R[1]R[2]中存放处理中断过程中需要用到的数据。

Void RunInt(int intType){

   switch (intType){

case 0: IntIO();break;

...

          default:error();break;

}

}

6 SPANVM虚拟机的运行时过程设计

SPANVM虚拟机的运行时模式分为正常模式和调试模式。

虚拟机有两种途径进入调试模式:1,命令行选项;2,在字节码可执行文件中设置断点。在启动虚拟机时命令行给出“-d”选项,则虚拟机在调试模式下开始执行,执行文字节码可执行文件中的第一条指令后将显示调试命令提示符。

正常模式就是虚拟机启动后,连续执行字节码指令,直到遇到停机指令。

SPANVM虚拟机运行过程如图 2所示

2 SPANVM的运行时过程

一个spanvm虚拟机进程在执行完一个可执行字节码文件后,进程本身也结束运行。

7 结束语

本项目是研究和实践虚拟机系统的开发,即屏蔽计算机的硬件,模拟CPU 与用户之间的中间软件 SPANVM在多种平台上移植成功后,意味着凡是符合SPANVM规范的可执行字节码文件都能在这些平台上被该虚拟机执行,而针对多种高级语言构造各自的编译器,其目标代码为SPANVM汇编语言代码后,通过汇编器将其翻译成符合SPANVM规范的可执行字节码文件,就可以实现基本的跨平台跨语言开发。

 

[1]  B.Brey. The Intel Microprocessors(Six Edition)[M]. Pearson Education2000

[2]  Morris Mano. Computer System Architecture(Third Edition)[M]. Prentice Hall1993

[3]  Bill Venners. Inside the Java Virtual Machine(Second Edition)[M]. McGraw-Hill Book Co,1999

[4]  李学干, 苏东庄. 计算机系统结构[M]. 西安电子科技大学出版社, 2000

[5]  沈美明,温冬婵. IBM-PC 汇编语言程序设计[M]. 清华大学出版社, 1991

[6]  李林华,盛浩,马世龙. 基于寄存器引擎的64位虚拟机的实现[J]. 计算机工程,2005.1,31卷第2

 

 

 

联系人:刘黎明

E-mailliuliming2008@126.com

电话:13817716098021-24057007

通讯地址:上海徐汇区东安二村24号甲303

邮编:200032

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:156214次
    • 积分:2529
    • 等级:
    • 排名:第14558名
    • 原创:94篇
    • 转载:4篇
    • 译文:1篇
    • 评论:19条
    最新评论