我将如何创建自己的VM?

时间:2009-09-11 12:10:15

标签: c assembly x86 virtualization

我想知道如何创建一个可以在Intel 16位系统之后建模的最小虚拟机。这将是我的第一个实际C项目,我的大部分代码都是100行或更少,但我有核心基础知识,阅读K& R,并了解事情应该如何工作,所以这几乎是对智慧的考验。

至于文档,工具,教程或关于如何解决此问题的简单旧提示/指针,有没有人可以指导我,到目前为止我理解我需要某处存储数据,各种CPU和某种类型的CPU作为中断控制器的机制。

我这样做是为了学习:系统内部,ASM内部和C - 计算的三个方面,我想在单个项目中学习。

请善意不要告诉我做一些简单的事情 - 这只会令人讨厌。 :)

感谢阅读,并希望写作!

4 个答案:

答案 0 :(得分:3)

虚拟机分为两类:一次解释代码指令的那些以及将代码编译为本机指令的那些(例如“JIT”)。

解释类别通常围绕指令执行循环构建,使用switch语句,计算gotos或函数指针来确定如何执行每条指令。

有一个有趣的平台,因其简单和有趣而值得学习:Corewars。

Corewars是一款编程挑战游戏,用“Redcode”编写的程序在MARS VM上运行。有许多MARS VM,通常用C语言编写。

它还启发了8086-based个版本,其中8086汇编程序编写的程序。

答案 1 :(得分:1)

好吧,对于初学者,我会为你想要虚拟化的处理器(如80286或类似程序)选择汇编语言的参考书。

答案 2 :(得分:1)

对于JIT,您可能需要dynamically generate and execute x86 code

答案 3 :(得分:0)

如果您想使用x86 VMM技术编写虚拟机,则需要做很多事情。

有一些关键指令,如VM_ENTER / VM_EXIT(名称可能因芯片而异,AMD和INTEL使用不同的名称,但功能相同)。这些指令实际上是特权的,因此,您需要编写一个内核模块来使用它们。

VM启动的第一步是启动它,因此,您将需要一个将加载的“BIOS”。然后,您需要模拟设备等。如果您愿意,甚至可以在这样的VM中运行旧版本的MSDOS。

总而言之,这显然不是微不足道的,需要大量的时间和精力。

现在,您可以执行类似于VMWare在虚拟化就绪CPU出现之前所做的事情。