7P by kunggom 2020-06-15 | favorite | 댓글과 토론

Michal Necasek이라는 사람이 지인으로부터 [AMD Ryzen 7 3800X(2019년 출시) CPU를 쓰는 시스템에서 가상 머신으로 Windows 3.11을 돌릴 수가 없더라]는 이야기를 듣고 문제의 원인을 조사한 글입니다. (영어)

조사 결과, 원인은 NDIS(Network Driver Interface Specification) 모듈에 있는 루프 딜레이 교정 로직 때문이었습니다. 해당 로직은 다음과 같은 방식으로 작동했습니다.

1. 시작할 때 현재 시각을 밀리초 단위로 파악한다.
2. 2^20(=1,048,576)회 LOOP 명령어를 실행한다.
3. 다시 현재 시각을 밀리초 단위로 파악하고, 이 값에서 시작할 때의 시각을 빼서 경과 시각을 구한다.
4. [2^20 / 경과 시각]을 계산하여, 1밀리초당 루프 횟수를 계산한다.

문제는 2^20회의 루프가 1밀리초 안에 끝날 경우 경과 시각이 0밀리초로 계산되므로 [0으로 나누기] 오류가 발생한다는 것이었습니다. 이 때문에 부팅에 실패했던 것이지요. 윈도우 3.11이 개발 및 발매되던 1993년 당시 PC 플랫폼에서 가장 빠른 CPU는 66 MHz짜리 인텔 펜티엄 프로세서였는데, 계산해 보면 해당 프로세서가 그만큼 루프를 돌려면 최선의 상황에서도 94밀리초 이상의 시간이 걸렸을 것이라는군요. 이는 당시 프로세서는 1사이클 안에 LOOP 명령어를 돌리지 못하기 때문이었기도 합니다. 그러나 현대의 CPU는 클럭 속도나 명령어당 사이클 횟수 등 여러 측면으로 볼 때 이런 옛날 운영체제를 돌리기에는 빨라도 너무 빠른 셈입니다.

원문을 보면 다른 흥미로운 내용도 나와 있습니다. 윈도우 95에서는 위 로직이 조금 변경되어 더 많은 곳에서 쓰였던 것이나, 인텔 프로세서에서는 펜티엄 3 1GHz 모델에서도 위 로직 실행에 6밀리초가 걸렸는데 AMD 프로세서에서는 K6-2 350MHz 모델에서도 문제가 발생하는 등 CPU 내부 동작 차이에 의해서 문제 발생 여부가 달라졌던 것이 설명되어 있습니다. 참고로 이 문제는 1999년에 발매된 윈도우 98 SE에 와서야 완전히 해결되었다고 합니다.