Why does Windows 95 sometimes fail to boot on a fast CPU?


by

Yining Zhang

It is well known that Windows 95 released in 1995 fails to start when running on a high-speed CPU, and a patch has been taken for AMD CPU ' K6-2 '. It was Regarding such 'Windows 95 startup failure problem', Michal Necasek , media master of ' OS/2 Museum ' that handles information of old PC and software from 1987 to 1997, elucidated the cause and learned lessons from it I'm talking.

Those Win9x Crashes on Fast Machines… | OS/2 Museum
http://www.os2museum.com/wp/those-win9x-crashes-on-fast-machines/

Necasek told a friend that ' Windows for Workgroups 3.11 won't start in a virtual machine.' It was a situation in which it rarely failed to start with the 'Core i7-2600', which is an Intel CPU, and failed each time with the 'Ryzen 7 3800X' of AMD.

When Necasek debugs the OS kernel, it turns out that division by zero occurs and the system is down. Upon further investigation, it was said that the cause was that the following processing was being performed inside NDIS, which is a program for accessing network functions.

1: Get the current time
2: Execute LOOP instruction 1,048,576 times
3: Obtain the time again after execution, and calculate the difference from the time obtained in 1.
4: Calculate the LOOP instruction execution count per millisecond by dividing 1,048,576 times by the calculated difference


It seems that there is no problem at first glance, but Necasek points out that the problem is that the current time can only be acquired in milliseconds. If you execute the LOOP instruction with a 'fast CPU' that does not take 1 millisecond to execute 1,048,576 times, the difference between the times acquired by 1 and 3 will be zero, so division by zero It will happen.

When the Windows 9x series was being developed, the rise in the CPU clock frequency was incredible. The clock frequency of the Pentium released in 1993 was 66MHz, but it reached up to 550MHz in the K6-2 released by AMD in 1998. Furthermore, this problem was reported in large numbers on AMD CPUs because AMD CPUs were able to execute LOOP instructions faster than Intel CPUs, Necasek pointed out. The 350MHz Pentium II took 17ms to execute 1,048,576 LOOP instructions, while the same 350MHz K-2 could be executed in 3ms.


by saramode

Exactly the same processing as Windows for Workgroups 3.11 is implemented in NDIS of Windows 95, so the OS still had the same problem. However, even with the K-2 patched under Windows 95, it takes 3 milliseconds to execute the LOOP instruction 1,048,576 times, so division by zero should not occur. As a result of Necasek's investigation, in Windows 95, the processing of the same structure as NDIS was implemented for storage-related processing, and it seems that overflow will occur if the difference of acquired time is not small enough even if it is not zero. It was found that there was a problem starting up with a CPU that can execute LOOP instructions at high speed.

Microsoft has distributed the storage-related problem that Windows 95 had as a patch for 'K6-2', and Windows 98 reflected the fix from the beginning. However, the NDIS problem was not fixed until the final version of Windows 98.

Necasek said that from a series of problems, Microsoft should have done a test 'what happens if the difference in the acquired time is less than 1 millisecond'. In addition, the assumption of a software engineer that 'the performance of the CPU does not immediately improve significantly' and the assumption of a hardware engineer that 'accelerating instructions is always good' seem to seem solid. It should be learned that neither of these was a solid assumption, Necasek said.

in Software,   Hardware, Posted by darkhorse_log