Một người tên Michal Necasek đã nghe từ một người quen rằng [không thể chạy Windows 3.11 trong máy ảo trên một hệ thống dùng CPU AMD Ryzen 7 3800X (ra mắt năm 2019)], rồi viết bài điều tra nguyên nhân của vấn đề. (tiếng Anh)
Kết quả điều tra cho thấy nguyên nhân nằm ở logic hiệu chỉnh độ trễ vòng lặp trong mô-đun NDIS (Network Driver Interface Specification). Logic đó hoạt động theo cách sau.
-
Khi khởi động, lấy thời điểm hiện tại theo đơn vị mili giây.
-
Thực thi lệnh LOOP 2^20 (=1.048.576) lần.
-
Lại lấy thời điểm hiện tại theo đơn vị mili giây, rồi trừ thời điểm lúc bắt đầu để tính thời gian đã trôi qua.
-
Tính [2^20 / thời gian đã trôi qua] để ra số vòng lặp trên mỗi mili giây.
Vấn đề là nếu 2^20 vòng lặp kết thúc trong vòng 1 mili giây thì thời gian đã trôi qua sẽ được tính là 0 mili giây, dẫn đến lỗi [chia cho 0]. Vì vậy quá trình khởi động bị thất bại. Vào năm 1993, khi Windows 3.11 được phát triển và phát hành, CPU nhanh nhất trên nền tảng PC là bộ xử lý Intel Pentium 66 MHz; nếu tính toán ra thì ngay cả trong điều kiện tốt nhất, bộ xử lý đó cũng phải mất hơn 94 mili giây để chạy chừng ấy vòng lặp. Một phần nguyên nhân là các bộ xử lý thời đó không thể thực thi lệnh LOOP trong một chu kỳ. Nhưng CPU hiện đại, xét về tốc độ xung nhịp lẫn số chu kỳ trên mỗi lệnh, lại quá nhanh để chạy những hệ điều hành cũ như vậy.
Trong nguyên văn còn có nhiều chi tiết thú vị khác. Chẳng hạn ở Windows 95, logic trên đã được thay đổi đôi chút và được dùng ở nhiều nơi hơn; đồng thời cũng giải thích vì sao trên bộ xử lý Intel, ngay cả mẫu Pentium III 1GHz vẫn mất 6 mili giây để chạy logic này, trong khi trên bộ xử lý AMD, vấn đề lại xuất hiện ngay cả với mẫu K6-2 350MHz, tức khả năng phát sinh lỗi còn phụ thuộc vào khác biệt trong cách CPU hoạt động bên trong. Tham khảo thêm thì phải đến Windows 98 SE phát hành năm 1999, vấn đề này mới được khắc phục hoàn toàn.
Chưa có bình luận nào.