发一款自己写的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的作者们!
【Screens