# onevm **Repository Path**: anykn/onevm ## Basic Information - **Project Name**: onevm - **Description**: onevm一个精简指令虚拟机。 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2022-03-14 - **Last Updated**: 2023-05-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OneVM 一个C语言实现超精简虚拟机 # 意义 - 对我而言,是处于兴趣,也是工作需要,掌握底层知识能够参与项目核心功能开发 - 对你而言,理解计算机工作原理,提升科学素养 # 目标 以最低成本实现一个自定义指令集的虚拟机,争取两个小时吃透这套项目的内容 # 组件 - 寄存器(通用寄存器,PC寄存器,IP寄存器) - 指令集(PSH,POP,MOV,SET,CMP,ADD,HLT) - 栈(使用数组模拟) # 步骤 ## 一、理解什么是虚拟机 虚拟机就是从一堆数字中,读取指令、解码指令,执行指令的虚拟计算机,为什么说是虚拟的,因为真实的计算机是使用CPU这个硬件完成这一系列操作的,而我们是使用变成语言来模拟这一些操作。 这可能与你实际认识不符,当我们查看一个文件是否,如果是2进制,则是一大堆0和1,如果是16进制,则是1-F之间的两个字符为一组的编码序列。是的,计算机并不认识除了0和1之外的东西,我们编写的C语言和汇编语言最终都要被编译成二进制的机器码,CPU负责解析和执行这些机器码。 但是在我们这里,我们还是以人类可读的编码来编写我们的虚拟机。 ## 二、虚拟机主要功能 正如上述,虚拟机主要功能是:读取、解码、执行。 ## 三、虚拟机支持的指令 ``` PSH 5 ;负责将数字5入栈,并且SP(栈指针寄存器)+1 PSH 6 ;负责将数字6入站,并且SP(栈指针寄存器)+1 ADD ;负责从栈顶弹出两个值,此时SP - 2, ADD指令完成后,将结果入栈,此时SP+1 POP ;负责从栈顶弹出一个值,同时SP-1,这里我们出于调试目的,将打印这个弹出的值 HLT ;程序停止在这里 ``` 这里如果使用C语言编写,将是这样的: ```C #include int main(int argc, char * argv[]) { int a = 5; int b = 6; int result = a + b; print("%d + %d = %d\n", a, b, result); return 0; } ``` ## 四、目录结构 出于一切以简单为原则,我们的目录结构设计如下: ``` . ├── main.c 虚拟机源代码 ├── makefile makefile工程管理文件 └── README.md 项目说明文件 ``` ## 五、文档教程 每一步的实现我们最终都会归档到docs/<序号>.md中,最终的`main.c`只包括最终代码,不过中间过程的代码。如果需要,你可以将markdown的每一步代码单独复制到`main.c`中编译运行。 - [第一节 编写makefile](./docs/1.md) - [第二节 指令读取与解析](./docs/2.md) - [第三节 优化代码](./docs/3.md) - [第四节 还能再优化么](./docs/4.md) - [第五节 升级扩展](./docs/5.md) 那么,从这里开始,起步一起学习吧~ ## 五、测试代码 我们要做的事情就是上面一节的指令这一块,假设我们现在已经实现了这个虚拟机,那么如何测试这个虚拟机? 1. 首先将指令保存到一个数组里 2. 遍历这个指令数组,读取每一条指令 3. 对每一条指令进行解析 4. 执行解析后的指令 # 参考资料 - 原文链接:https://felix.engineer/blogs/virtual-machine-in-c - 译文链接:https://www.oschina.net/translate/virtual-machine-in-c