3 Star 2 Fork 2

万里 / onevm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
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语言编写,将是这样的:

#include<stdio.h>

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中编译运行。

那么,从这里开始,起步一起学习吧~

五、测试代码

我们要做的事情就是上面一节的指令这一块,假设我们现在已经实现了这个虚拟机,那么如何测试这个虚拟机?

  1. 首先将指令保存到一个数组里
  2. 遍历这个指令数组,读取每一条指令
  3. 对每一条指令进行解析
  4. 执行解析后的指令

参考资料

空文件

简介

onevm一个精简指令虚拟机。 展开 收起
C 等 3 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/wanliofficial/onevm.git
git@gitee.com:wanliofficial/onevm.git
wanliofficial
onevm
onevm
master

搜索帮助