虚拟机
虚拟机的实现包含三个文件
jerry-vm.c
环境配置, 参数分析和 I/O 设定. main 函数在这个文件中
vm.h
类型定义, 以及全局变量的声明.
vm.c
指令的实现
这些文件编译链接后产生 JerryVM.out 可执行文件. 它的命令行参数之一是 Jerry 字节码. 它将读入指令然后执行它们.
双帧栈
所谓的双帧栈就是只栈内有两个栈段, 一个存放栈内数据, 一个进行算术运算. 这是一种简单, 但是非常浪费空间的处理方式.
正确的做法应该是根据符号表预估栈内变量总大小, 并留足这个空间, 使运算在这个空间之上进行.
这两个栈帧在 vm.h 中声明, 此外, 还有两个重要的段指针.
typedef char Segment[MAX_VAR_IN_STACK]; // 段类型定义
extern Segment ds; // 栈内数据段, 存放栈内数据
extern Segment ss; // 栈段, 实际作用仅存放运算栈
extern void* pc; // program counter, 在 main 中读入指令之后初始化
extern void* sp; // 栈顶指针, 在 main 中初始化, 指向 ss
I/O
虚拟机本身的 I/O 当然是转调 C 库的 I/O (我可懒得去关心操作系统 :-), 不过, 虚拟机提供两个参数来重定向 I/O, 它们是 OPTION_INPUT_SPECIFY ("-input") 和 OPTION_OUTPUT_SPECIFY ("-output"), 定义在 jerry-vm.c 中. 这里, 虚拟机对命令行参数的处理与编译器类似 (是的, 一样龌龊的循环-判同捕捉).
另外有两个字符指针, hintInputReal 和 hintInputInt, 它们起先指向两个提示输入的字符串, 当输入被重定向之后, 它们则指向空字符串.
运行
打开 byte-code, 读入指令, 在一切准备妥当之后, 调用 execute() 便开始执行指令了. 在 vm.c 中, 你可以看到更多更混乱的代码.
vm.c
跳过前面若干行代码, 直接看数组 execs, 这是一个跳转表, 每个指令的指令码作为数组索引, 即可得到一个函数入口地址, 当该地址为 NULL 时, 表明这个指令码是程序结束.
至于前前后后的代码, 就是虚拟机指令的实现了. 这里就不多说了.
分享到:
相关推荐
通过对DEX文件的分析,我们了解到DEX文件如何组织和存储代码、数据以及元数据。这对于理解Dalvik虚拟机的工作原理及其对代码执行的影响非常重要。此外,了解DEX文件结构也有助于开发者更好地调试和优化自己的Android...
- **规范组织结构**:该规范详细介绍了JVM的各种组成部分及其工作原理,包括数据类型、运行时数据区域、指令集等。 #### 二、Java虚拟机结构 - **class文件格式**:定义了类和接口的数据结构,用于描述类或接口的...
创建虚拟机之前,需要考虑虚拟机的以下方面:资源的名称、资源的存储位置、虚拟机的大小、可创建的最大虚拟机数、虚拟机运行的操作系统、虚拟机在启动后的配置、虚拟机需要的相关资源。 虚拟机的应用场景包括: * ...
在IT行业中,虚拟化技术是云计算服务的基础,OpenStack作为一款开源的云计算平台,广泛用于构建私有...对于使用OpenStack的企业和组织而言,掌握这些恢复步骤至关重要,可以有效地降低因虚拟机故障导致的业务中断风险。
面对虚拟机逃逸技术所带来的威胁,企业和组织需要采取一系列应对措施: - **定期更新和打补丁**:确保所有的虚拟化软件都是最新版本,并及时应用官方发布的安全补丁。 - **实施多层次安全防护**:除了基本的防火墙和...
C语言可以通过数组、结构体等方式来组织字库数据。例如,每个字符可能对应一个二维数组,表示字符的点阵信息。 三、字库加载与使用 1. 字库文件读取:在C语言中,可以使用标准库函数fopen、fread等读取字库文件,...
适用于需要进行VMware虚拟机数据迁移的企业或组织,可能是因为硬件升级、数据中心迁移、灾难恢复计划等需求。 1.4 考前须知 在开始迁移前,必须了解源和目标环境的详细信息,包括硬件配置、网络拓扑、存储类型和...
首先,文档提到的云计算数据中心中的虚拟化技术,是指在一个物理服务器上运行多个虚拟机实例的技术。这种技术允许不同虚拟机共享同一物理硬件资源,并且可以动态地对这些资源进行分配和迁移,从而提高资源利用率。 ...
8. **异常处理**:源码可能包含对各种运行时错误和异常的处理机制。 9. **编译与调试**:学习如何使用易语言的编译器和调试工具来测试和优化代码。 10. **虚拟机监控**:可能有监控虚拟机状态(如CPU使用率、内存...
在应用这个补丁时,用户应遵循标准的更新流程,例如备份现有系统,然后下载并安装补丁,最后验证补丁是否成功安装并运行良好。同时,为了保持最佳的系统状态,用户应定期检查并安装最新的虚拟机补丁,以便及时获得...
每个虚拟机都像是一个独立的计算机,可以安装不同的操作系统,这意味着在一个虚拟机中的活动不会影响到其他虚拟机或宿主机上的数据。 #### 2. 灵活性 用户可以在几分钟内创建新的虚拟机,并轻松地调整其配置。此外...
Java虚拟机(JVM)是一种...JVM的内存结构是一个复杂的系统,涉及类的加载和运行时数据的组织与管理。了解这些结构有助于深入理解Java程序是如何在JVM上运行的,同样对于优化程序性能、避免内存溢出等都有重要的意义。
它通过特殊的软件层——虚拟化软件或者虚拟机监控器(Hypervisor),在物理计算机上创建和运行多个独立的操作系统实例,每个实例都拥有自己的虚拟硬件资源,如CPU、内存、硬盘等,这些虚拟硬件资源由实际的物理硬件...
#### 三、运行时数据区 - **程序计数器(PC寄存器)**:每线程一个,存储当前线程所执行的字节码指令的位置。 - **Java虚拟机栈**:每个线程都有自己的栈,用于存储局部变量表、操作数栈、动态链接信息以及方法出口...
- **运行时数据区**: JVM在执行期间管理的数据区域,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区等。 **3. 运行时数据区详解** - **程序计数器**(The pc Register): 当前线程所执行的字节码指令的地址。 - ...
3. **vmplayer.exe**:VMware Player是VMware提供的免费虚拟机运行程序,它允许用户直接运行虚拟机而不需进行复杂的设置或管理。vmplayer.exe可能是这个汉化包的核心组件,让用户能够轻松打开和操作虚拟机实例,尤其...
2. **运行时数据区**:包括堆、方法区、栈、本地方法栈和程序计数器,它们分别存储不同类型的运行时数据。 3. **字节码执行引擎**:解释执行字节码,通过操作数栈和局部变量表完成计算。 4. **垃圾收集**:详细...
- Java类文件格式定义了如何组织类的数据,包括字段、方法、属性等。 7. **类加载器(Class Loader)** - 类加载器负责读取字节码文件(.class),解析出构成类或接口的数据,并生成代表类或接口的`java.lang.Class`...