发一款自己写的80x86虚拟机 NXVM
【简介】
这个虚拟机是用C编写的,一共37,000行代码。
它完整的模拟了一台PC,包括一个80386 CPU,以及所有必要的设备,例如内存、DMA、中断控制器、软驱、硬盘、键盘、显示器等。
因此,它可以运行一个基于x86的操作系统,如MS-DOS6.22。
NXVM虚拟机可以同时在Windows和Linux下通过编译。在Windows下,它可以运行在命令提示符窗口中(将Win32控制台作为虚拟机显示器和键盘),也可以创建自己的窗口(更加稳定)。在Linux下,它暂时只能在80x25尺寸的终端窗口中正常运行,有一定的限制。
除此之外,NXVM还包含了一个完整的调试器(16/32位),汇编器和反汇编器。因此,不仅可以跑操作系统,更可以单步调试、下断点、查看寄存器和内存状况,
以此对操作系统进行调试。
它可以运行MS-DOS 6.22系统和其他第三方程序。
对于MS-DOS 6.22,除了常规启动以外,还实现了高位内存访问(HMA),也就是DOS内核可以载入到1MB以上64K的内存中。
除了源代码以外,我还为虚拟机编写了一份设计文档,里面有详细的代码分析和使用指南,可以帮助感兴趣的人理解这一虚拟机的运作过程。
由于时间有限、文档缺乏,有部分设备没能完整实现。并且80386 CPU的虚拟86模式和保护模式也并不完整,所以暂时还只能运行MS-DOS 6.22。
之所以编写这个虚拟机,是因为自己对底层结构非常感兴趣。并且看到了easyVM的发布,因此也跃跃欲试。
NXVM的设计部分参考了easyVM(8086 CPU的指令分派和端口结构设计),CPU的调试是通过同步执行Bochs CPU,并比较寄存器/内存读写的值。
另外,LightMachine的文档也提供了不少的帮助。感谢easyVM、LightMachine和Bochs的作者们!
【Screenshot】
虚拟机状态
启动MS-DOS 6.22
MS-DOS运行在常规内存
MS-DOS运行在HMA
经典打字程序TT
俄罗斯方块NYET
Turbo C
Win95的Edit(使用部分32位指令)
MSAV病毒扫描
磁盘碎片整理
在Win32窗口中运行:
在Linux终端中运行:
【编译】
1. 在Linux下编译:解压zip,进入nxvm目录,使用makefile进行编译,输出a.out
2. 在Windows下编译:在VS2008、VS2010或VS2012中,创建空的Win32控制台项目,
把vmachine文件夹下面的所有C和H文件加入;把nxvm文件夹下面的main.c,console.c 和console.h加入。
然后排除掉vmachine/system/linux.ch,以及vmachine/vcpuapi.cc,以及vmachine/vcpuins_i8086.c。
编译为x64 Release即可。
【使用】
1. 将下载的2个磁盘镜像(fd.img和hd.img)放在可执行文件的同一个目录中,然后运行。
2. 输入start,就可以从虚拟机控制台启动MS-DOS 6.22
3. 在MS-DOS 6.22运行的时候,只要按下F9,就会停止虚拟机的运行。
4. 在windows下,如果不想运行在win32控制台中,可以在start之前输入mode命令来切换。这样,在虚拟机运行时,控制台窗口也同时存在,接受用户命令。
更多的使用方法请参阅《设计文档》。
【下载】
GITHUB: http://github.com/cshaxu/nxvm/
源代码、磁盘镜像和设计文档:http://sdrv.ms/17XmGWa