Этот проект представляет собой эмулятор DOS, который использует API API платформы Hypervisor Windows (WHP) для создания виртуального процессора, позволяя выполнять программы DOS в виртуализированной 16-разрядной среде реального режима в современных системах Windows.
В моем предыдущем эмуляторе Windows 3.1 процессор 80286 был полностью эмулирован в программном обеспечении. Однако для этого проекта я решил использовать другой подход, используя аппаратную виртуализацию для процессора, одновременно подражая только слою DOS в программном обеспечении.
Этот эмулятор в основном служит демонстрацией WHP API и не предназначен для функционирования как полный эмулятор DOS. Была реализована минимальная функциональность DOS, достаточная только для запуска нескольких образцов программ, хотя структура была разработана, чтобы легко расширяться.
Эмулятор инициализирует виртуальный процессор с использованием API WHP, настраивая его для запуска в реальном режиме, гарантируя, что биты PE (защищенный режим) и PG (Paging) отключены в регистре CR0.
Исполняемый файл DOS отображается в хост эмулятора и совместно используется с гостем по соответствующему физическому адресу, моделируя макет памяти реальной системы DOS.
Большая часть функциональности DOS происходит с помощью прерываний, таких как 0x21 для системных служб и 0x10 для видео операций, которые должны эмулировать вручную в программном обеспечении. Прерывания не запускают выходы на виртуальные машины и требуют дополнительных хитростей, чтобы запечатлеть их. Это легко решать путем реализации пользовательской таблицы векторов прерываний (IVT), где каждое прерывание указывает на инструкцию процессора. Эта конфигурация гарантирует, что выход виртуальной машины запускается, когда происходит прерывание, что позволяет эмулятору перехватить и обрабатывать прерывание.
Программы DOS часто используют порты ввода -вывода, например, для динамика ПК, CMOS и The Adwange Timers. Запросы ввода -вывода легко захватываются, потому что инструкции in
и out
запускают выход виртуальной машины, что позволяет эмулировать функциональность. В настоящее время поддерживается только очень небольшой набор запросов ввода/вывода.
Программы DOS использовали различные методы для поддержания времени. Этот эмулятор включает в себя поддержку нескольких из этих механизмов:
0000:046C
, альтернатива доступа к памяти напрямую.Таймер ямы 8253 в настоящее время не полностью реализован.
Эмулятор отслеживает состояние клавиатуры и поддерживает простой буфер ключей, передавая информацию в программу DOS с помощью прерываний клавиатуры (0x16) по мере необходимости.
Поддерживаются основные команды терминала, что позволяет эмулятору запускать простые текстовые игры и другие базовые программы.
В настоящее время эмулятор выделяет пространство для системных полей, таких как области данных BIOS и префикс сегмента программы (PSP). Тем не менее, эти поля в настоящее время не заполнены, за исключением значения счетчика BIOS. Дополнительные поля могут быть заполнены по мере необходимости.
Тестирование проводилось с использованием простой игры DOS от Flareon 2023 (Flaresay.exe, Challenge #6), в первую очередь потому, что в то время это был единственный исполняемый файл DOS на моем жестком диске.
В дополнение к этому эмулятору DOS, я добился некоторого успеха с аналогичной концепцией, направленной на эмуляцию 64-битных/32-битных программ пользовательского режима Windows. Создавая моделируемую среду CPL3 и подключив регистр MSR_LSTAR, можно подражать исполняемому файлу и заставить выезд виртуальной машины на системных вызовах. Это позволяет эмулятору захватить и либо перенаправлять запрос на системный вызов в хост ОС, либо перехватывать его. Этот метод имеет много осложнений, но могут быть достоверные варианты использования, когда легкий эмулятор может быть полезен.