Este proyecto es un emulador de DOS que utiliza la API de la plataforma Hypervisor de Windows (WHP) para crear una CPU virtual, lo que permite la ejecución de programas DOS dentro de un entorno de modo real virtualizado de 16 bits en los sistemas modernos de Windows.
En mi emulador Windows 3.1 anterior, la CPU 80286 se emuló completamente en el software. Sin embargo, para este proyecto, decidí adoptar un enfoque diferente utilizando la virtualización de hardware para la CPU mientras emulaba solo la capa DOS en el software.
Este emulador sirve principalmente como una demostración de la API WHP y no está destinado a funcionar como un emulador DOS completo. Se ha implementado una funcionalidad mínima de DOS, suficiente solo para ejecutar algunos programas de muestra, aunque el marco se ha diseñado para ser fácilmente extensible.
El emulador inicializa una CPU virtual utilizando la API WHP, configurándola para ejecutarse en modo real asegurando que los bits de PE (Modo de modo protegido) y PG (PAGING) estén deshabilitados en el registro CR0.
El ejecutable de DOS se asigna al host del emulador y se comparte con el invitado en la dirección física apropiada, simulando el diseño de memoria de un sistema DOS real.
La mayoría de la funcionalidad DOS ocurre a través de interrupciones, como 0x21 para servicios del sistema y 0x10 para operaciones de video, que deben emularse manualmente en software. Las interrupciones no activan inherentemente las salidas de VM y requieren trucos adicionales para capturarlos. Esto se aborda fácilmente mediante la implementación de una tabla Vector de interrupción personalizada (IVT) donde cada interrupción apunta a una instrucción CPUID. Esta configuración garantiza que se active una salida de VM cuando ocurre una interrupción, lo que permite que el emulador intercepte y maneje la interrupción.
Los programas DOS a menudo utilizan puertos de E/S, como para el altavoz de PC, CMOS y temporizadores de hardware. Las solicitudes de E/S se capturan fácilmente porque las instrucciones in
y out
desencadenan una salida de VM, lo que permite emular la funcionalidad. Actualmente, solo se admiten un conjunto muy pequeño de solicitudes de E/S comunes.
Los programas DOS utilizaron varios métodos para mantener el tiempo. Este emulador incluye soporte para algunos de estos mecanismos seleccionados:
0000:046C
, una alternativa para acceder directamente a la memoria.El temporizador de PIT 8253 no se implementa completamente en este momento.
El emulador monitorea el estado del teclado y mantiene un búfer de tecla simple, pasando información al programa DOS a través de interrupciones del teclado (0x16) según sea necesario.
Se admiten comandos de terminal básicos, lo que permite que el emulador ejecute juegos simples basados en texto y otros programas básicos.
El emulador actualmente asigna espacio para los campos del sistema, como las áreas de datos del BIOS y el prefijo del segmento del programa (PSP). Sin embargo, estos campos no están poblados actualmente, excepto el valor del contador BIOS. Los campos adicionales se pueden poblar según sea necesario.
Las pruebas se han realizado utilizando un juego DOS simple de Flaron 2023 (Flaresay.exe, Challenge #6), principalmente porque era el único ejecutable de DOS en mi disco duro en ese momento.
Además de este emulador DOS, he tenido cierto éxito con un concepto similar destinado a emular programas de modo de usuario de Windows de 64 bits/32 bits. Al construir un entorno CPL3 simulado y enganchar el registro MSR_LSTAR, es posible emular un ejecutable y forzar una salida de VM en las llamadas del sistema. Esto permite que el emulador capture y reenvíe la solicitud de llamadas del sistema al sistema operativo host o lo intercepta. Esta técnica viene con muchas complicaciones, pero puede haber casos de uso válidos en los que un emulador liviano podría ser útil.