Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我将如何创建自己的虚拟机?_C_Assembly_X86_Virtualization - Fatal编程技术网

C 我将如何创建自己的虚拟机?

C 我将如何创建自己的虚拟机?,c,assembly,x86,virtualization,C,Assembly,X86,Virtualization,我想知道如何创建一个仿照Intel 16位系统的最小虚拟机。这将是我的第一个实际的C项目,我的大部分代码不超过100行,但我已经掌握了核心基础知识,阅读了K&R,理解了事情应该如何运作,所以这几乎是对智慧的测试 有没有人能为我提供文档、工具、教程或简单的老提示/指针,让我了解如何实现这一点,到目前为止,我知道我需要一个存储数据的地方,一个CPU,以及某种作为中断控制器的机制 我这样做是为了学习:系统内部、ASM内部和C——我想在一个单一项目中学习计算的三个方面 请不要告诉我做更简单的事,那只会让

我想知道如何创建一个仿照Intel 16位系统的最小虚拟机。这将是我的第一个实际的C项目,我的大部分代码不超过100行,但我已经掌握了核心基础知识,阅读了K&R,理解了事情应该如何运作,所以这几乎是对智慧的测试

有没有人能为我提供文档、工具、教程或简单的老提示/指针,让我了解如何实现这一点,到目前为止,我知道我需要一个存储数据的地方,一个CPU,以及某种作为中断控制器的机制

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

请不要告诉我做更简单的事,那只会让人讨厌。:)


感谢您的阅读,并希望您的写作

首先,我会为您打算虚拟化的处理器挑选一本汇编语言参考书,如80286或类似产品。

虚拟机分为两类:一类是一次解释代码指令,另一类是将代码编译为本机指令(例如“JIT”)

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

有一个有趣的平台,它简单有趣,值得研究:Corewars

是一款编程挑战游戏,其中以“”编写的程序在火星虚拟机上运行。有许多s,通常用C编写


它还启发了一些版本,在这些版本中,8086汇编程序中编写的程序会发生冲突。

对于JIT,您可能需要。

如果您想使用x86 VMM技术编写虚拟机,您将需要很多东西

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

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

总而言之,这显然不是一件小事,需要大量的时间和精力


现在,您可以做一些类似于VMWare在支持虚拟化的CPU出现之前所做的事情

您描述的不是虚拟机,而是模拟器。@E.T好的,第一行是“虚拟机(VM)是对特定计算机系统的模拟”。那么,你想做什么区别呢?我的意思是,一个仿真器(如果你考虑JIT作为一个例子)解释代码字节,并执行一些编译的代码本身。VMM,特别是那些使用硬件特性的VMM,可以让原始代码像在物理机器上一样运行。事实上,唯一被模仿的就是设备。当人们谈论虚拟机时,首先想到的是与之配套的虚拟机监控程序。@E.T你的意思是JVM命名错误吗?您会说Bochs或QEMU是vm吗?QEMU是一个虚拟机(KVM是Type-II虚拟机监控程序)。Bochs是一个模拟器。虚拟机在其中运行。