이 프로젝트는 WHP (Windows Hypervisor Platform) API를 사용하여 가상 CPU를 생성하여 최신 Windows 시스템에서 가상화 된 16 비트 실제 모드 환경 내에서 DOS 프로그램을 실행할 수있는 DOS 에뮬레이터입니다.
이전 Windows 3.1 에뮬레이터에서 80286 CPU는 소프트웨어로 완전히 모방되었습니다. 그러나이 프로젝트의 경우 CPU에 대한 하드웨어 가상화를 사용하여 소프트웨어의 DOS 계층만을 모방하여 다른 접근 방식을 취하기로 결정했습니다.
이 에뮬레이터는 주로 WHP API의 데모 역할을하며 완전한 DOS 에뮬레이터로 기능하기위한 것이 아닙니다. 프레임 워크는 쉽게 확장 할 수 있도록 설계되었지만 최소 DOS 기능이 몇 가지 샘플 프로그램 만 실행하기에 충분합니다.
에뮬레이터는 WHP API를 사용하여 가상 CPU를 초기화하여 PE (보호 모드 활성화) 및 PG (페이징) 비트가 CR0 레지스터에서 비활성화되도록하여 실제 모드에서 실행하도록 구성합니다.
DOS 실행 파일은 에뮬레이터 호스트에 매핑되어 적절한 물리적 주소에서 게스트와 공유하여 실제 DOS 시스템의 메모리 레이아웃을 시뮬레이션합니다.
대부분의 DOS 기능은 시스템 서비스의 경우 0x21, 비디오 작업의 경우 0x10과 같은 인터럽트를 통해 발생하며 소프트웨어에서 수동으로 모방해야합니다. 인터럽트는 본질적으로 VM 종료를 트리거하지 않으며이를 캡처하기 위해 추가 트릭이 필요합니다. 이는 각 인터럽트가 CPUID 명령을 가리키는 사용자 정의 인터럽트 벡터 테이블 (IVT)을 구현하여 쉽게 해결할 수 있습니다. 이 구성은 인터럽트가 발생할 때 VM 출구가 트리거되도록하여 에뮬레이터가 인터셉트하고 인터럽트를 처리 할 수 있도록합니다.
DOS 프로그램은 종종 PC 스피커, CMO 및 하드웨어 타이머와 같은 I/O 포트를 사용합니다. I/O 요청은 in
및 out
지침이 VM 종료를 트리거하여 기능을 모방 할 수 있으므로 쉽게 캡처 할 수 있습니다. 현재 매우 작은 일반적인 I/O 요청 세트 만 지원됩니다.
DOS 프로그램은 타이밍을 유지하기 위해 다양한 방법을 사용했습니다. 이 에뮬레이터에는 이러한 메커니즘 중 일부에 대한 지원이 포함됩니다.
0000:046C
에서 반환합니다.8253 PIT 타이머는 현재 완전히 구현되지 않았습니다.
에뮬레이터는 키보드 상태를 모니터링하고 간단한 키 버퍼를 유지하여 필요에 따라 키보드 인터럽트 (0x16)를 통해 DOS 프로그램에 정보를 전달합니다.
기본 터미널 명령이 지원되므로 에뮬레이터가 간단한 텍스트 기반 게임 및 기타 기본 프로그램을 실행할 수 있습니다.
에뮬레이터는 현재 BIOS 데이터 영역 및 프로그램 세그먼트 접두사 (PSP)와 같은 시스템 필드에 공간을 할당합니다. 그러나 BIOS 카운터 값을 제외 하고이 필드는 현재 채워져 있지 않습니다. 필요에 따라 추가 필드를 채울 수 있습니다.
테스트는 Flareon 2023 (Flaresay.exe, Challenge #6)의 간단한 DOS 게임을 사용하여 수행되었습니다.
이 DOS 에뮬레이터 외에도 64 비트/32 비트 Windows 사용자 모드 프로그램을 모방하는 비슷한 개념으로 성공했습니다. 시뮬레이션 된 CPL3 환경을 구축하고 MSR_LSTAR 레지스터를 연결함으로써 실행 파일을 모방하고 시스템 호출에 대한 VM 종료를 강제 할 수 있습니다. 이를 통해 에뮬레이터가 시스템 호출 요청을 호스트 OS로 캡처하고 전달하거나 가로 채겠습니다. 이 기술에는 많은 합병증이 제공되지만 경량 에뮬레이터가 유용한 유효한 사용 사례가있을 수 있습니다.