มีบทความที่ Michal Necasek เขียนขึ้นหลังจากได้ยินจากคนรู้จักว่า [ไม่สามารถรัน Windows 3.11 ในเครื่องเสมือนบนระบบที่ใช้ CPU AMD Ryzen 7 3800X (ออกปี 2019) ได้] จึงได้สืบหาสาเหตุของปัญหานี้ไว้ (ภาษาอังกฤษ)
จากการตรวจสอบพบว่าสาเหตุมาจากลอจิกสำหรับคาลิเบรต loop delay ที่อยู่ในโมดูล NDIS (Network Driver Interface Specification) โดยลอจิกดังกล่าวทำงานตามขั้นตอนดังนี้
-
ตอนเริ่มต้น ให้อ่านเวลาปัจจุบันในหน่วยมิลลิวินาที
-
รันคำสั่ง LOOP จำนวน 2^20 (=1,048,576) ครั้ง
-
จากนั้นอ่านเวลาปัจจุบันอีกครั้งในหน่วยมิลลิวินาที แล้วนำค่าตอนเริ่มต้นมาลบออกเพื่อหาเวลาที่ผ่านไป
-
คำนวณ [2^20 / เวลาที่ผ่านไป] เพื่อหาจำนวนรอบลูปต่อ 1 มิลลิวินาที
ปัญหาคือถ้าลูป 2^20 ครั้งเสร็จภายในเวลาไม่ถึง 1 มิลลิวินาที เวลาที่ผ่านไปจะถูกคำนวณเป็น 0 มิลลิวินาที ทำให้เกิดข้อผิดพลาด [หารด้วย 0] และส่งผลให้บูตไม่สำเร็จ ในช่วงปี 1993 ที่ Windows 3.11 ถูกพัฒนาและวางจำหน่ายนั้น CPU ที่เร็วที่สุดบนแพลตฟอร์มพีซีคือ Intel Pentium ความเร็ว 66 MHz และเมื่อคำนวณดูแล้ว ซีพียูรุ่นดังกล่าวน่าจะต้องใช้เวลาอย่างน้อย 94 มิลลิวินาทีจึงจะวนลูปได้ครบเท่านั้น เหตุผลหนึ่งคือโปรเซสเซอร์ในยุคนั้นไม่สามารถรันคำสั่ง LOOP ได้ภายใน 1 cycle แต่ CPU สมัยใหม่เมื่อพิจารณาทั้งความถี่สัญญาณนาฬิกาและจำนวน cycle ต่อคำสั่งแล้ว ก็เรียกได้ว่าเร็วเกินไปมากสำหรับการรันระบบปฏิบัติการโบราณเหล่านี้
ในบทความต้นฉบับยังมีเรื่องน่าสนใจอื่น ๆ อีก เช่น ใน Windows 95 ลอจิกนี้ถูกปรับเปลี่ยนเล็กน้อยและถูกนำไปใช้ในหลายจุดมากขึ้น อีกทั้งยังอธิบายว่าบนโปรเซสเซอร์ Intel แม้แต่ Pentium III 1GHz ก็ยังใช้เวลา 6 มิลลิวินาทีในการรันลอจิกนี้ แต่บนโปรเซสเซอร์ AMD กลับเกิดปัญหาได้ตั้งแต่ K6-2 350MHz แสดงให้เห็นว่าความแตกต่างของการทำงานภายใน CPU ก็มีผลต่อการเกิดปัญหานี้เช่นกัน และปัญหานี้เพิ่งถูกแก้ไขอย่างสมบูรณ์ใน Windows 98 SE ที่ออกวางจำหน่ายในปี 1999
ยังไม่มีความคิดเห็น