該項目是一個DOS模擬器,它利用Windows Hypervisor平台(WHP)API創建虛擬CPU,從而在現代Windows系統上虛擬化的16位房地產模式環境中執行DOS程序。
在我以前的Windows 3.1模擬器中,80286 CPU在軟件中完全模擬。但是,對於這個項目,我決定通過使用硬件虛擬化為CPU採用不同的方法,同時僅模擬軟件中的DOS層。
該模擬器主要用作WHP API的演示,並且不打算充當完整的DOS模擬器。已經實現了最小的DOS功能,只能運行一些示例程序,儘管該框架的設計易於擴展。
模擬器使用WHP API初始化虛擬CPU,通過確保在CR0寄存器中禁用PE(受保護的模式啟用)和PG(PG(分頁)位),以將其配置為實體模式。
DOS可執行文件被映射到模擬器主機中,並在適當的物理地址與來賓共享,從而模擬了真實DOS系統的內存佈局。
大多數DOS功能都是通過中斷發生的,例如用於系統服務的0x21和用於視頻操作的0x10,必須在軟件中手動模擬。中斷不會固有地觸發VM退出,並且需要其他技巧來捕獲它們。通過實現自定義中斷向量表(IVT),每個中斷指向CPUID指令,可以輕鬆解決這一點。這種配置可確保當中斷時觸發VM出口,從而使模擬器能夠攔截和處理中斷。
DOS程序通常使用I/O端口,例如PC揚聲器,CMO和硬件計時器。 I/O請求很容易捕獲,因為in
和out
指令觸發了VM出口,從而允許模擬功能。當前,僅支持一組很少的常見I/O請求。
DOS程序使用了各種方法來維持時間安排。該模擬器包括對其中一些機制的支持:
0000:046C
返回BIOS計數器值,這是直接訪問內存的替代方案。目前尚未完全實施8253個進站計時器。
模擬器監視鍵盤狀態並維護一個簡單的鍵緩衝區,並根據需要通過鍵盤中斷(0x16)將信息傳遞到DOS程序。
支持基本終端命令,從而使模擬器可以運行簡單的基於文本的遊戲和其他基本程序。
模擬器當前為系統字段(例如BIOS數據區域和程序段前綴(PSP))分配空間。但是,除了BIOS計數器值外,這些字段目前尚未填充。可以根據需要填充其他字段。
測試是使用Flareon 2023(Flaresay.exe,Challenge#6)的簡單DOS遊戲進行的,這主要是因為它是當時我硬盤上唯一可執行的DOS。
除了此DOS模擬器外,我還獲得了一些類似概念,旨在模擬64位/32位Windows用戶模式程序。通過構建模擬的CPL3環境並掛接MSR_LSTAR寄存器,可以模仿可執行文件並強制系統調用中的VM出口。這使模擬器可以捕獲並將系統調用請求轉發到主機OS或攔截它。該技術確實帶有許多並發症,但是在某些有效的用例中,輕量級仿真器可能有用。