7 pontos por kunggom 2020-06-15 | Ainda não há comentários. | Compartilhar no WhatsApp

Uma pessoa chamada Michal Necasek ouviu de um conhecido que [não conseguia rodar o Windows 3.11 em uma máquina virtual em um sistema com CPU AMD Ryzen 7 3800X (lançada em 2019)] e investigou a causa do problema em um texto. (Em inglês)

O resultado da investigação mostrou que a causa era a lógica de calibração de atraso de loop existente no módulo NDIS (Network Driver Interface Specification). Essa lógica funcionava da seguinte forma.

  1. No início, obtém a hora atual em milissegundos.

  2. Executa a instrução LOOP 2^20 (= 1.048.576) vezes.

  3. Obtém novamente a hora atual em milissegundos e subtrai a hora inicial desse valor para calcular o tempo decorrido.

  4. Calcula [2^20 / tempo decorrido] para obter o número de loops por milissegundo.

O problema era que, se os 2^20 loops terminassem em menos de 1 milissegundo, o tempo decorrido seria calculado como 0 milissegundo, causando um erro de [divisão por zero]. Foi isso que levava à falha na inicialização. Na época em que o Windows 3.11 estava sendo desenvolvido e lançado, em 1993, a CPU mais rápida da plataforma PC era o processador Intel Pentium de 66 MHz; fazendo as contas, mesmo nas melhores condições esse processador levaria mais de 94 milissegundos para executar essa quantidade de loops. Isso também ocorria porque os processadores da época não conseguiam executar a instrução LOOP em 1 ciclo. Já as CPUs modernas, considerando vários aspectos como velocidade de clock e número de ciclos por instrução, são simplesmente rápidas demais para rodar esses sistemas operacionais antigos.

No texto original também aparecem outros pontos interessantes. É explicado, por exemplo, que no Windows 95 a lógica acima foi ligeiramente modificada e passou a ser usada em mais lugares, e que em processadores Intel a execução dessa lógica ainda levava 6 milissegundos até mesmo no Pentium III de 1 GHz, enquanto em processadores AMD o problema ocorria até no K6-2 de 350 MHz, mostrando que a ocorrência do problema variava conforme diferenças no funcionamento interno da CPU. Como referência, esse problema só foi totalmente resolvido no Windows 98 SE, lançado em 1999.

Ainda não há comentários.

Ainda não há comentários.