โครงการนี้เป็นตัวจำลอง DOS ที่ใช้ Windows Hypervisor Platform (WHP) API เพื่อสร้าง CPU เสมือนจริงเพื่อให้การดำเนินการของโปรแกรม DOS ภายในสภาพแวดล้อมโหมดจริง 16 บิตเสมือนจริงบนระบบ Windows ที่ทันสมัย
ใน Emulator Windows 3.1 ก่อนหน้าของฉัน CPU 80286 ได้รับการจำลองอย่างสมบูรณ์ในซอฟต์แวร์ อย่างไรก็ตามสำหรับโครงการนี้ฉันตัดสินใจที่จะใช้วิธีการที่แตกต่างกันโดยใช้ฮาร์ดแวร์เสมือนจริงสำหรับ CPU ในขณะที่เลียนแบบเฉพาะ DOS Layer ในซอฟต์แวร์
อีมูเลเตอร์นี้ทำหน้าที่เป็นการสาธิต WHP API เป็นหลักและไม่ได้มีวัตถุประสงค์เพื่อทำหน้าที่เป็นตัวจำลอง DOS ที่สมบูรณ์ ฟังก์ชั่น DOS ขั้นต่ำได้ถูกนำมาใช้เพียงพอที่จะเรียกใช้โปรแกรมตัวอย่างไม่กี่รายการแม้ว่าเฟรมเวิร์กได้รับการออกแบบให้สามารถขยายได้ง่าย
Emulator เริ่มต้น CPU เสมือนจริงโดยใช้ WHP API โดยกำหนดค่าให้ทำงานในโหมดจริงโดยตรวจสอบให้แน่ใจว่าการเปิดใช้งาน PE (โหมดป้องกัน) และบิต PG (Paging) ถูกปิดใช้งานในการลงทะเบียน CR0
DOS Executable ถูกแมปเข้ากับโฮสต์ Emulator และแชร์กับแขกตามที่อยู่ทางกายภาพที่เหมาะสมโดยจำลองเลย์เอาต์หน่วยความจำของระบบ DOS จริง
ฟังก์ชั่น DOS ส่วนใหญ่เกิดขึ้นผ่านการขัดจังหวะเช่น 0x21 สำหรับบริการระบบและ 0x10 สำหรับการดำเนินการวิดีโอซึ่งจะต้องจำลองด้วยตนเองในซอฟต์แวร์ การขัดจังหวะไม่ได้ทำให้เกิดการออกจาก VM โดยเนื้อแท้และต้องการกลอุบายเพิ่มเติมในการจับภาพ สิ่งนี้ได้รับการแก้ไขได้อย่างง่ายดายโดยการใช้ตารางเวกเตอร์ขัดจังหวะที่กำหนดเอง (IVT) ซึ่งแต่ละจุดขัดจังหวะไปยังคำสั่ง CPUID การกำหนดค่านี้ช่วยให้มั่นใจได้ว่าการออกจาก VM จะถูกกระตุ้นเมื่อเกิดการขัดจังหวะทำให้ตัวจำลองสามารถสกัดกั้นและจัดการกับการขัดจังหวะ
โปรแกรม DOS มักจะใช้ประโยชน์จากพอร์ต I/O เช่นสำหรับลำโพงพีซี, CMOS และตัวจับเวลาฮาร์ดแวร์ คำขอ I/O ถูกจับได้ง่ายเนื่องจากคำแนะนำ in
และ out
ทำให้เกิดการออกจาก VM ทำให้สามารถใช้งานได้ ปัจจุบันรองรับการร้องขอ I/O ทั่วไปเพียงชุดเดียวเท่านั้น
โปรแกรม DOS ใช้วิธีการต่าง ๆ ในการรักษาเวลา Emulator นี้รวมถึงการสนับสนุนสำหรับกลไกเหล่านี้เลือกไม่กี่อย่าง:
0000:046C
ทางเลือกในการเข้าถึงหน่วยความจำโดยตรงตัวจับเวลาหลุม 8253 ยังไม่ได้ใช้งานอย่างเต็มที่ในเวลานี้
ตัวจำลองตรวจสอบสถานะแป้นพิมพ์และรักษาบัฟเฟอร์คีย์อย่างง่ายส่งข้อมูลไปยังโปรแกรม DOS ผ่านการขัดจังหวะแป้นพิมพ์ (0x16) ตามความจำเป็น
รองรับคำสั่งเทอร์มินัลพื้นฐานช่วยให้ Emulator สามารถเรียกใช้เกมที่ใช้ข้อความง่าย ๆ และโปรแกรมพื้นฐานอื่น ๆ
ปัจจุบัน Emulator จัดสรรพื้นที่สำหรับฟิลด์ระบบเช่นพื้นที่ข้อมูล BIOS และส่วนคำนำหน้าส่วนโปรแกรม (PSP) อย่างไรก็ตามฟิลด์เหล่านี้ไม่ได้มีประชากรอยู่ในปัจจุบันยกเว้นค่าตัวนับ BIOS สามารถเติมฟิลด์เพิ่มเติมได้ตามความจำเป็น
การทดสอบได้ดำเนินการโดยใช้เกม DOS อย่างง่ายจาก Flareon 2023 (flaresay.exe, Challenge #6) ส่วนใหญ่เป็นเพราะ DOS เพียงคนเดียวที่ทำงานได้ในฮาร์ดดิสก์ของฉันในเวลานั้น
นอกเหนือจากตัวจำลอง DOS นี้ฉันยังประสบความสำเร็จด้วยแนวคิดที่คล้ายกันซึ่งมีวัตถุประสงค์เพื่อเลียนแบบโปรแกรมโหมดผู้ใช้ Windows 64 บิต/32 บิต ด้วยการสร้างสภาพแวดล้อม CPL3 จำลองและเชื่อมต่อการลงทะเบียน MSR_LSTAR มันเป็นไปได้ที่จะเลียนแบบการปฏิบัติการและบังคับให้ออกจาก VM ในการโทรของระบบ สิ่งนี้ช่วยให้อีมูเลเตอร์จับภาพและส่งต่อการร้องขอการเรียกระบบไปยังโฮสต์ระบบปฏิบัติการหรือสกัดกั้น เทคนิคนี้มาพร้อมกับภาวะแทรกซ้อนมากมาย แต่อาจมีกรณีการใช้งานที่ถูกต้องซึ่งตัวจำลองน้ำหนักเบาอาจเป็นประโยชน์