Este projeto é um emulador do DOS que utiliza a API da plataforma Windows Hypervisor (WHP) para criar uma CPU virtual, permitindo a execução de programas DOS dentro de um ambiente de moda real virtualizado de 16 bits nos modernos sistemas Windows.
No meu emulador anterior do Windows 3.1, a CPU 80286 foi totalmente emulada no software. No entanto, para este projeto, decidi adotar uma abordagem diferente usando a virtualização de hardware para a CPU enquanto impede apenas a camada DOS no software.
Este emulador serve principalmente como uma demonstração da API WHP e não se destina a funcionar como um emulador de DOS completo. A funcionalidade mínima do DOS foi implementada, suficiente apenas para executar alguns programas de amostra, embora a estrutura tenha sido projetada para ser facilmente extensível.
O emulador inicializa uma CPU virtual usando a API WHP, configurando-a para executar no modo real, garantindo que o PE (Modo Protecting Ativa) e PG (paging) sejam desativados no registro CR0.
O executável do DOS é mapeado para o host emulador e compartilhado com o convidado no endereço físico apropriado, simulando o layout da memória de um sistema DOS real.
A maioria da funcionalidade do DOS ocorre por interrupções, como 0x21 para serviços do sistema e 0x10 para operações de vídeo, que devem ser emuladas manualmente no software. As interrupções não acionam inerentemente as saídas da VM e requerem truques adicionais para capturá -los. Isso é facilmente abordado pela implementação de uma tabela de vetores de interrupção personalizada (IVT), onde cada interrupção aponta para uma instrução CPUID. Essa configuração garante que uma saída de VM seja acionada quando ocorre uma interrupção, permitindo que o emulador intercepte e manipule a interrupção.
Os programas DOS geralmente usam portas de E/S, como para o alto -falante do PC, CMOs e timers de hardware. As solicitações de E/S são facilmente capturadas porque as instruções in
e out
acionam uma saída de VM, permitindo que a funcionalidade seja emulada. Atualmente, apenas um pequeno conjunto de solicitações de E/S comuns são suportadas.
Os programas DOS usaram vários métodos para manter o tempo. Este emulador inclui suporte para alguns desses mecanismos selecionados:
0000:046C
, uma alternativa para acessar a memória diretamente.O 8253 Pit Timer não está totalmente implementado no momento.
O emulador monitora o estado do teclado e mantém um buffer de chave simples, passando informações para o programa DOS via interrupções no teclado (0x16), conforme necessário.
Os comandos básicos do terminal são suportados, permitindo que o emulador execute jogos simples baseados em texto e outros programas básicos.
Atualmente, o emulador aloca espaço para campos do sistema, como áreas de dados do BIOS e o prefixo do segmento de programa (PSP). No entanto, esses campos não estão atualmente preenchidos, exceto o valor do contador do BIOS. Campos adicionais podem ser preenchidos conforme necessário.
Os testes foram realizados usando um jogo simples do Flareon 2023 (Flaresay.exe, desafio nº 6), principalmente porque era o único executável do DOS no meu disco rígido na época.
Além deste emulador do DOS, tive algum sucesso com um conceito semelhante destinado a emular programas de modo de usuário do Windows de 64 bits/32 bits. Ao criar um ambiente CPL3 simulado e conectar o registro MSR_LSTAR, é possível emular um executável e forçar uma saída de VM nas chamadas do sistema. Isso permite que o emulador capture e encaminhe a solicitação de chamada do sistema para o sistema operacional host ou interceptá -lo. Essa técnica vem com muitas complicações, mas pode haver casos de uso válidos em que um emulador leve pode ser útil.