- บทความอภิปรายเชิงเทคนิคอย่างละเอียดจาก Retrocomputing Stack Exchange เกี่ยวกับปัญหาที่เคอร์เนล NT 3.1 ทำให้เครื่อง 486DX4 รีบูต
- ผู้เขียนได้ติดตั้ง Windows NT 3.1 บนระบบ Compaq ProSignia 3080 และเปลี่ยน Intel 486DX-33 เป็น AMD enhanced 486DX4-SV8B เพื่อเพิ่มประสิทธิภาพ
- ผู้เขียนพบปัญหาเมื่อพยายามเข้าสู่การดีบักเคอร์เนล โดยแทนที่จะได้พรอมป์ต์
kd> เครื่องกลับรีบูต
- ผู้เขียนได้ทดสอบสาเหตุที่เป็นไปได้หลายอย่าง เช่น หน่วยความจำ ความเสียหายของไฟล์ระบบ การทำงานของฮาร์ดแวร์วอตช์ด็อก และการสื่อสารผ่านอะแดปเตอร์ USB-to-serial แต่ไม่มีข้อใดเป็นต้นเหตุ
- ผู้เขียนค้นพบว่าเคอร์เนล Windows NT 3.1 ไม่เข้ากันกับโปรเซสเซอร์ 486 รุ่นปรับปรุง โดยเฉพาะรุ่นที่รองรับคำสั่ง CPUID
- พบว่าสาเหตุด้านความเข้ากันได้นี้ย้อนรอยไปยังบั๊กในฟังก์ชัน KiSaveProcessorControlState ที่บันทึกรีจิสเตอร์ควบคุมของโปรเซสเซอร์ลงในโครงสร้าง CONTEXT แบบขยาย
- บั๊กดังกล่าวทำให้ฟังก์ชันตีความไบต์ที่ออฟเซ็ต 19h ของ KPRCB เป็นส่วนหนึ่งของหมายเลขโมเดล ส่งผลให้โปรเซสเซอร์ 80-4-86 ที่รองรับ CPUID ถูกมองเป็น 80-260-86
- ผู้เขียนเสนอการแก้ไขโดยแพตช์คำสั่ง
cmp ds:word_FFDFF138, 5 ให้เป็นการเปรียบเทียบแบบไบต์ ซึ่งต้องแก้สองครั้งใน NTOSKRNL.EXE
- การสืบสวนอย่างละเอียดและแนวทางแก้ไขที่ผู้เขียนเสนอเป็นข้อมูลอ้างอิงที่มีประโยชน์สำหรับผู้ที่พบปัญหาคล้ายกันกับเคอร์เนล NT 3.1 บนโปรเซสเซอร์ 486 รุ่นปรับปรุง
1 ความคิดเห็น
ความเห็นจาก Hacker News