Рэймонд Чен рассказал об «ужасном» коде эмулятора x86

от автора

Инженер Microsoft Рэймонд Чен рассказал, как команда разработчиков Microsoft обнаружила настолько плохой код эмулятора x86, что исправила его во время эмуляции. 

По его словам, это история из тех времен, когда Windows включала эмулятор процессора x86-32 на системах, изначально работающих на каком-то другом процессоре. Данный эмулятор использовал бинарную трансляцию, генерируя нативный код для выполнения эквивалентных операций исходного кода x86-32. 

«Это обеспечивало значительное повышение производительности по сравнению с эмуляцией через интерпретатор. Можно представить, что x86-32 — это просто байт-код, а эмулятор — это JIT-компилятор», — отметил Чен.

По словам инженера, его коллега обнаружил, что одной программе необходимо выделить около 64 КБ памяти в стеке и инициализировать её. Стандартный способ сделать это — выполнить проверку стека, чтобы убедиться, что 64 КБ памяти доступны, затем вычесть 65536 из указателя стека и инициализировать память в небольшом цикле. Однако, вместо того чтобы создавать цикл для инициализации каждого байта буфера, компилятор «оптимизировал» код, развернув цикл в 65 536 отдельных инструкций «запись байта в память», каждая длиной в 4 байта.

Таким образом, для инициализации 64 килобайт данных программе потребовалось 256 килобайт кода.

«Это настолько возмутило команду, что они добавили в транслятор специальный код для обнаружения этой ужасной функции и замены её эквивалентным “плотным” циклом», — заключил Чен.

Ранее инженер объяснил, что происходит, когда пользователь удерживает клавишу Shift при перезагрузке Windows, и вместо полной перезагрузки системы при этом отображается сообщение «Windows перезагружается».

Кроме того, разработчик поделился, что ещё в 90-е годы производители компьютеров добавили строки авторских прав в BIOS, чтобы предлагать клиентам полные версии пробного программного обеспечения в качестве бонуса.

Наконец, Чен раскрыл очередной секрет эпохи 16-битной Windows, связанный с названием ошибки hard error. Он отметил, что сообщения были сгенерированы внутри системы ввода-вывода, ниже уровня пользовательского интерфейса.

ссылка на оригинал статьи https://habr.com/ru/articles/1048436/