论文部分内容阅读
摘 要:本文对虚拟机的体系结构与内存机制进行了整体的设计与分析,阐述了虚拟机CPU平台的体系结构,在明确了运行时系统和应用程序级上的内存管理机制的基础上,对动态内存管理机制进行了分析与研究,并对目前主流的虚拟机内存管理技术进行了较深入的分析与研究,选取适合于 XVA 虚拟机的内存管理机制,并用C语言实现了一个基于Windows平台的面向科学计算的小型虚拟机软件系统XVA,是为了给学生提供一个虚拟实验环境,同时让学生更好的了解、掌握虚拟机的原理及其基本应用。
关键词:CPU体系结构;内存管理技术;XVA虚拟机
中图分类号:TP277
1 虚拟机的体系结构的设计
要设计XVA虚拟机的基本执行环境,就必须对虚拟机的体系结构进行一下整体的分析与设计,利用资源管理器的技术对虚拟机的体系结构做出组织和规划是很方便的。研究XVA虚拟机CPU环境平台所拥有的基本组成部分和虚拟机对这些逻辑部件的管理方法,对XVA虚拟机的具体实现有着十分重要的作用。本文所设计的XVA虚拟机软件系统的组成结构可以分为以下几大部分:寄存器组、数据堆、虚拟机运行期间的数据区域、数据栈、计算栈、参照栈、过程装载器系统、本地方法接口、执行引擎、本地动态链接库等。虚拟机的体系结构具体表示如下图:
图1-1 虚拟机的体系结构图
1.1 CPU体系结构分析
虚拟机运行期间的数据区域包括虚拟机的寄存器组和所有栈区。它是虚拟机的核心,也就是虚拟机的内存。虚拟机在运行期间会将所有待保存的程序和数据统一分配到几个数据区域来进行管理。因为内存是所有应用程序运行的基础,因此这几部分数据区域在虚拟机的设计与实现中有着举足轻重的作用。其中寄存器组和很多CPU中的寄存器功能是一样的,主要用来设置机器运行期间的状态。栈区包括很多栈,像数据栈、数据堆、计算栈、参照栈等等,这些栈都是由许多栈帧组成的,每个栈帧都代表了不同的运行状态。当应用程序执行一个过程调用时,就是将一个新的栈帧压入到栈中的过程,而过程调用结束后,这个栈帧将从栈中弹出并释放掉。
在虚拟机的实现过程中,过程装载系统的设计有着很重要的作用,它主要负责查找应用程序并且将应用程序装载到内存中去。一般来说,在设计虚拟机软件系统的时候,都会设有一个过程装载器系统,在程序执行期间,系统会根据给定的调用过程名来装载应用程序。
本地方法接口的定义是当一个进程调用本地程序和数据的时侯,这个进程就基本上摆脱了虚拟机在结构方面和安全限制方面对它的限制,这时这个进程可以使用本地处理器进行系统调用,也可以使用数据栈、数据堆等进行系统调用,它还可以访问虚拟机在运行期间的所有数据区域。
执行引擎对每个设计的虚拟机软件系统来说也是一个必须有的逻辑部件,它的主要功能是执行指令,执行那些在过程装载系统中的指令。在虚拟机的体系结构中,执行引擎的位置很关键,它正处于虚拟机的中间部位。在定义虚拟机的规范中,执行引擎的行为是由指令集所决定的。虚拟机大约支持200多个字节码。每个字节码指令的功能是不一样的,每条字节码指令都要执行类似于加减乘除、子程序转移等这样最基本的运算。指令集中指令的组成部分是操作数和操作符,操作数是程序执行过程中所需的数据或参数,操作符具体指定要执行什么样的操作。指令集实际上就是汇编语言,它的功能和汇编语言是一样的。
2 虚拟机的内存管理技术
XVA虚拟机的最基本的设计目标就是可移植性。为了达到虚拟机的可移植性,在程序设计过程中考虑通过相关的软件来实现内存保护机制。在设计XVA虚拟机时,将XVA可执行文件里的数值编码设置为降序格式,之所以这样做是为了使XVA虚拟机中的二进制代码能够在不同的硬件平台上运行。虚拟机软件系统XVA在启动时首先会向操作系统申请内存分配,然后用分配到的内存来组成一个人工地址空间。这个人工地址空间又被分为一个正文段、一个堆栈段和一个数据堆段,这三个内存段都是为单个XVA应用程序来使用的。如下图所示:
图1-2 XVA地址空间图
XVA的地址空间是从正文段开始一直到堆栈段的结束。堆栈段和数据堆段的长度是随时变化的,而正文段的长度在程序开始编译过程中就已经确定下来了。XVA虚拟机在实际启动之前,内存段中的地址是不固定的。通过XVA虚拟机的命令行参数,堆栈和数据堆的长度可以设置为一个正值。XVA虚拟机的内存地址空间是从000H 开始,途中经过正文段、数据堆段,一直到堆栈段的结束。在这段内存地址空间中所有的信息都将在这里进行统一组织和管理。在程序执行过程中,汇编器对源程序的处理过程是这样的,首先将机器指令装入到内存单元中去,这些程序代码统一放在内存中的低地址空间里,内存的剩余空间由用户随意进行分配。这个剩余内存空间通常被划分为数据堆和堆栈两个区域。堆栈和数据堆的长度一般都是通过XVA虚拟机的命令行参数来设置的一个正数,并且它们的长度在程序执行过程中是可变的。在设计XVA虚拟机软件系统过程时,段寄存器VV和DD就是用来保存堆栈和数据堆的起始地址的。内存空间中的代码段的长度是在程序编译过程中定下来的。除此之外,XVA 虚拟机在执行过程中还将对内存引用现象进行严格检查,内存引用比位于最低端的正文段还低或者是超出位于内存高端的堆栈段,这样的问题在程序执行过程中一经出现,后果将会十分严重,因此要坚决避免这种情况的发生。同时 XVA虚拟机运行时系统对堆栈段中的内存分配也会进行严格检查,既确保它不会溢出栈顶和数据堆中。之所以制定这样几条严谨的防护措施是为了是防止任何一个可能出错的环节一旦出现异常对XVA运行时系统造成的破坏性的损坏。在设计XVA虚拟机运行时系统时,它的内存总量也就是说堆栈、数据堆以及正文段的内存总和是从开始时就确定下来的,这样做的目的就是为了保护宿主操作系统。为了防止系统崩溃,XVA应用程序的动态内存分配请求一般不再向宿主系统申请,如果要想申请额外地址空间只能向数据堆请求分配。通常为了保存程序的返回地址,要显式地设定堆栈区,将堆栈指针 SI初始化并设置在高端内存区,这样做有利于程序正常、准确的运行。
对于有很多层嵌套的应用程序来说,有时一些破坏性的代码会闯进来。也就是说堆栈很可能会导致程序的不正常运行以致发生异常错误。其实对数据堆的管理就是虚拟机的动态内存分配问题。综上,本文设计的虚拟机软件系统XVA是采用了一种基于顺序匹配算法的最先匹配算法的显示内存管理技术。
参考文献:
[1]Bill Blunden著,杨涛等译.虚拟机的设计与实现——C/C++[M].机械工业出版社,2003,98.
[2]朱成光.栈式虚拟机的开发运行平台的设计与实现[D].西北工业大学硕士学位论文,2007.
[3]赵旭泽.虚拟机平台的设计与关键模块的实现[D].沈阳理工大学硕士学位论文,2011.
[4]林巧民.虚拟机相关技术研究及实现[D].河海大学硕士学位论文,2004.
[5]廖健.基于虚拟机的存储过程设计与实现[D].华中科技大学硕士学位论文,2004.
关键词:CPU体系结构;内存管理技术;XVA虚拟机
中图分类号:TP277
1 虚拟机的体系结构的设计
要设计XVA虚拟机的基本执行环境,就必须对虚拟机的体系结构进行一下整体的分析与设计,利用资源管理器的技术对虚拟机的体系结构做出组织和规划是很方便的。研究XVA虚拟机CPU环境平台所拥有的基本组成部分和虚拟机对这些逻辑部件的管理方法,对XVA虚拟机的具体实现有着十分重要的作用。本文所设计的XVA虚拟机软件系统的组成结构可以分为以下几大部分:寄存器组、数据堆、虚拟机运行期间的数据区域、数据栈、计算栈、参照栈、过程装载器系统、本地方法接口、执行引擎、本地动态链接库等。虚拟机的体系结构具体表示如下图:
图1-1 虚拟机的体系结构图
1.1 CPU体系结构分析
虚拟机运行期间的数据区域包括虚拟机的寄存器组和所有栈区。它是虚拟机的核心,也就是虚拟机的内存。虚拟机在运行期间会将所有待保存的程序和数据统一分配到几个数据区域来进行管理。因为内存是所有应用程序运行的基础,因此这几部分数据区域在虚拟机的设计与实现中有着举足轻重的作用。其中寄存器组和很多CPU中的寄存器功能是一样的,主要用来设置机器运行期间的状态。栈区包括很多栈,像数据栈、数据堆、计算栈、参照栈等等,这些栈都是由许多栈帧组成的,每个栈帧都代表了不同的运行状态。当应用程序执行一个过程调用时,就是将一个新的栈帧压入到栈中的过程,而过程调用结束后,这个栈帧将从栈中弹出并释放掉。
在虚拟机的实现过程中,过程装载系统的设计有着很重要的作用,它主要负责查找应用程序并且将应用程序装载到内存中去。一般来说,在设计虚拟机软件系统的时候,都会设有一个过程装载器系统,在程序执行期间,系统会根据给定的调用过程名来装载应用程序。
本地方法接口的定义是当一个进程调用本地程序和数据的时侯,这个进程就基本上摆脱了虚拟机在结构方面和安全限制方面对它的限制,这时这个进程可以使用本地处理器进行系统调用,也可以使用数据栈、数据堆等进行系统调用,它还可以访问虚拟机在运行期间的所有数据区域。
执行引擎对每个设计的虚拟机软件系统来说也是一个必须有的逻辑部件,它的主要功能是执行指令,执行那些在过程装载系统中的指令。在虚拟机的体系结构中,执行引擎的位置很关键,它正处于虚拟机的中间部位。在定义虚拟机的规范中,执行引擎的行为是由指令集所决定的。虚拟机大约支持200多个字节码。每个字节码指令的功能是不一样的,每条字节码指令都要执行类似于加减乘除、子程序转移等这样最基本的运算。指令集中指令的组成部分是操作数和操作符,操作数是程序执行过程中所需的数据或参数,操作符具体指定要执行什么样的操作。指令集实际上就是汇编语言,它的功能和汇编语言是一样的。
2 虚拟机的内存管理技术
XVA虚拟机的最基本的设计目标就是可移植性。为了达到虚拟机的可移植性,在程序设计过程中考虑通过相关的软件来实现内存保护机制。在设计XVA虚拟机时,将XVA可执行文件里的数值编码设置为降序格式,之所以这样做是为了使XVA虚拟机中的二进制代码能够在不同的硬件平台上运行。虚拟机软件系统XVA在启动时首先会向操作系统申请内存分配,然后用分配到的内存来组成一个人工地址空间。这个人工地址空间又被分为一个正文段、一个堆栈段和一个数据堆段,这三个内存段都是为单个XVA应用程序来使用的。如下图所示:
图1-2 XVA地址空间图
XVA的地址空间是从正文段开始一直到堆栈段的结束。堆栈段和数据堆段的长度是随时变化的,而正文段的长度在程序开始编译过程中就已经确定下来了。XVA虚拟机在实际启动之前,内存段中的地址是不固定的。通过XVA虚拟机的命令行参数,堆栈和数据堆的长度可以设置为一个正值。XVA虚拟机的内存地址空间是从000H 开始,途中经过正文段、数据堆段,一直到堆栈段的结束。在这段内存地址空间中所有的信息都将在这里进行统一组织和管理。在程序执行过程中,汇编器对源程序的处理过程是这样的,首先将机器指令装入到内存单元中去,这些程序代码统一放在内存中的低地址空间里,内存的剩余空间由用户随意进行分配。这个剩余内存空间通常被划分为数据堆和堆栈两个区域。堆栈和数据堆的长度一般都是通过XVA虚拟机的命令行参数来设置的一个正数,并且它们的长度在程序执行过程中是可变的。在设计XVA虚拟机软件系统过程时,段寄存器VV和DD就是用来保存堆栈和数据堆的起始地址的。内存空间中的代码段的长度是在程序编译过程中定下来的。除此之外,XVA 虚拟机在执行过程中还将对内存引用现象进行严格检查,内存引用比位于最低端的正文段还低或者是超出位于内存高端的堆栈段,这样的问题在程序执行过程中一经出现,后果将会十分严重,因此要坚决避免这种情况的发生。同时 XVA虚拟机运行时系统对堆栈段中的内存分配也会进行严格检查,既确保它不会溢出栈顶和数据堆中。之所以制定这样几条严谨的防护措施是为了是防止任何一个可能出错的环节一旦出现异常对XVA运行时系统造成的破坏性的损坏。在设计XVA虚拟机运行时系统时,它的内存总量也就是说堆栈、数据堆以及正文段的内存总和是从开始时就确定下来的,这样做的目的就是为了保护宿主操作系统。为了防止系统崩溃,XVA应用程序的动态内存分配请求一般不再向宿主系统申请,如果要想申请额外地址空间只能向数据堆请求分配。通常为了保存程序的返回地址,要显式地设定堆栈区,将堆栈指针 SI初始化并设置在高端内存区,这样做有利于程序正常、准确的运行。
对于有很多层嵌套的应用程序来说,有时一些破坏性的代码会闯进来。也就是说堆栈很可能会导致程序的不正常运行以致发生异常错误。其实对数据堆的管理就是虚拟机的动态内存分配问题。综上,本文设计的虚拟机软件系统XVA是采用了一种基于顺序匹配算法的最先匹配算法的显示内存管理技术。
参考文献:
[1]Bill Blunden著,杨涛等译.虚拟机的设计与实现——C/C++[M].机械工业出版社,2003,98.
[2]朱成光.栈式虚拟机的开发运行平台的设计与实现[D].西北工业大学硕士学位论文,2007.
[3]赵旭泽.虚拟机平台的设计与关键模块的实现[D].沈阳理工大学硕士学位论文,2011.
[4]林巧民.虚拟机相关技术研究及实现[D].河海大学硕士学位论文,2004.
[5]廖健.基于虚拟机的存储过程设计与实现[D].华中科技大学硕士学位论文,2004.