Ce projet est un émulateur DOS qui utilise l'API Windows HyperVisor Platform (WHP) pour créer un CPU virtuel, permettant l'exécution de programmes DOS dans un environnement en mode réel 16 bits virtualisé sur les systèmes Windows modernes.
Dans mon précédent émulateur Windows 3.1, le CPU 80286 a été entièrement émulé dans les logiciels. Cependant, pour ce projet, j'ai décidé d'adopter une approche différente en utilisant la virtualisation matérielle pour le CPU tout en émulant uniquement la couche DOS dans le logiciel.
Cet émulateur sert principalement de démonstration de l'API WHP et n'est pas destiné à fonctionner comme un émulateur DOS complet. La fonctionnalité DOS minimale a été mise en œuvre, suffisante pour exécuter quelques programmes d'échantillons, bien que le cadre ait été conçu pour être facilement extensible.
L'émulateur initialise un processeur virtuel à l'aide de l'API WHP, en le configurant pour s'exécuter en mode réel en s'assurant que les bits PE (mode protégé) et PG (pagination) sont désactivés dans le registre CR0.
L'exécutable DOS est mappé dans l'hôte de l'émulateur et partagé avec l'invité à l'adresse physique appropriée, simulant la disposition de la mémoire d'un véritable système DOS.
La plupart des fonctionnalités DOS se produisent via des interruptions, telles que 0x21 pour les services système et 0x10 pour les opérations vidéo, qui doivent être émulées manuellement dans les logiciels. Les interruptions ne déclenchent pas intrinsèquement les sorties VM et nécessitent des astuces supplémentaires pour les capturer. Ceci est facilement traité en implémentant une table vectorielle d'interruption personnalisée (IVT) où chaque interruption pointe vers une instruction CPUID. Cette configuration garantit qu'une sortie VM est déclenchée lorsqu'une interruption se produit, permettant à l'émulateur d'intercepter et de gérer l'interruption.
Les programmes DOS utilisent souvent des ports d'E / S, comme pour le haut-parleur PC, les CMO et les minuteries matérielles. Les demandes d'E / S sont facilement capturées car les instructions in
et out
déclenchent une sortie de machine virtuelle, permettant à la fonctionnalité de diffuser les fonctionnalités. Actuellement, seul un très petit ensemble de demandes d'E / S communs est pris en charge.
Les programmes DOS ont utilisé diverses méthodes pour maintenir le timing. Cet émulateur comprend un support pour quelques-uns de ces mécanismes:
0000:046C
, une alternative à l'accès directement à la mémoire.La minuterie 8253 PIT n'est pas pleinement implémentée pour le moment.
L'émulateur surveille l'état du clavier et maintient un tampon de clé simple, passant des informations au programme DOS via les interruptions du clavier (0x16) si nécessaire.
Les commandes de terminal de base sont prises en charge, permettant à l'émulateur d'exécuter des jeux de texte simples et d'autres programmes de base.
L'émulateur alloue actuellement l'espace pour les champs système, tels que les zones de données BIOS et le préfixe du segment du programme (PSP). Cependant, ces champs ne sont pas actuellement peuplés, à l'exception de la valeur de comptoir du BIOS. Les champs supplémentaires peuvent être peuplés si nécessaire.
Les tests ont été effectués en utilisant un jeu DOS simple de Flareon 2023 (Flaresay.exe, Challenge # 6), principalement parce que c'était le seul exécutable DOS sur mon disque dur à l'époque.
En plus de cet émulateur DOS, j'ai eu un certain succès avec un concept similaire visant à imiter les programmes de mode utilisateur Windows 64 bits / 32 bits. En construisant un environnement CPL3 simulé et en accrochant le registre MSR_LSTAR, il est possible d'imiter un exécutable et de forcer une sortie VM sur les appels système. Cela permet à l'émulateur de capturer et de transmettre la demande d'appel système au système d'exploitation hôte ou de l'intercepter. Cette technique est livrée avec de nombreuses complications, mais il peut y avoir des cas d'utilisation valides où un émulateur léger pourrait être utile.