Ошибка Pentium F00F - Pentium F00F bug

В Ошибка Pentium F00F это недостаток дизайна в большинстве Intel Pentium, Pentium MMX, и Pentium OverDrive процессоры (все в Микроархитектура Р5 ). Обнаруженный в 1997 году, он может привести к прекращению работы процессора до тех пор, пока компьютер не будет физически перезагружен. В ошибка был обойден через Операционная система обновления.

Название сокращено для F0 0F C7 C8, то шестнадцатеричный кодирование одного оскорбительного инструкция.[1] Более формально ошибка называется неверный операнд с ошибкой заблокированной инструкции CMPXCHG8B.[2]

Описание

в архитектура x86, последовательность байтов F0 0F C7 C8 представляет собой инструкцию блокировка cmpxchg8b eax (заблокировано сравнение и обмен 8 байт в регистре EAX). Ошибка также распространяется на коды операций, заканчивающиеся на C9 через CF, которые указывают регистр операнды кроме EAX. В F0 0F C7 C8 инструкция не требует особые привилегии.

Эта кодировка инструкции недействительна. В cmpxchg8b инструкция сравнивает значение в EDX и EAX регистры с 8-байт значение в ячейке памяти. Однако в этом случае вместо ячейки памяти указывается регистр, что недопустимо.

При нормальных обстоятельствах это просто привело бы к исключение; однако при использовании с замок префикса (обычно используется для предотвращения взаимодействия двух процессоров с одним и тем же участком памяти), ЦП ошибочно использует заблокированные циклы шины для чтения дескриптора обработчика исключений недопустимой инструкции. Заблокированные чтения должны сочетаться с заблокированными записями, и интерфейс шины ЦП обеспечивает это, запрещая доступ к памяти другим пользователям до тех пор, пока не произойдет соответствующая запись. Поскольку их нет, после выполнения этих циклов шины вся активность ЦП прекращается, и ЦП должен быть сброшен для восстановления.

В связи с распространением микропроцессоров Intel существование этой инструкции с открытыми привилегиями в то время считалось серьезной проблемой. Операционная система поставщики ответили реализацией обходные пути это обнаружило условие и предотвратило сбой. Информация об ошибке впервые появилась в Интернете 8 ноября 1997 г. или около того.[3] Поскольку ошибка F00F стала общеизвестной, этот термин иногда используется для описания подобных недостатков конструкции оборудования, таких как Cyrix coma ошибка.

Выполнение инструкции F00F в уязвимой системе не приводит к необратимому повреждению оборудования; он просто блокируется до перезагрузки. Тем не мение, потери данных несохраненных данных, вероятно, если дисковые буферы не были сброшены, если приводы были прерваны во время операции записи, или если другиеатомная операция был прерван.

B2 шагать решил эту проблему для процессоров Intel Pentium.[2]

Инструкцию F00F можно рассматривать как пример Остановиться и загореться (HCF) инструкция.

Обходные пути

Хотя для окончательного решения этой проблемы требовалась какая-то доработка оборудования / прошивки, в то время были предложены обходные пути.[1] что предотвратило использование этой проблемы для создания атака отказа в обслуживании на пораженной машине. Все они основывались на насильственном разбиении паттерна ошибочных обращений к шине, ответственных за зависание процессора. Предлагаемые Intel (следовательно, «официальные») решения требовали создания таблицы дескрипторов прерываний неестественным образом, вынуждающего процессор выдавать ошибку промежуточной страницы, прежде чем он сможет получить доступ к памяти, содержащей дескриптор для исключения undefined-opcode. Этих посторонних обращений к памяти оказалось достаточно, чтобы интерфейс шины отпустил требование блокировки, которое было основной причиной ошибки.

В частности, таблица дескрипторов прерываний, которая обычно находится на одной странице памяти, вместо этого разбивается на две страницы, так что дескрипторы для первых семи обработчиков исключений находятся на странице, а остальная часть таблицы на следующей странице. Тогда обработчик исключения неопределенного кода операции является последним дескриптором на первой странице, а обработчик исключения ошибки страницы находится на второй странице. Первую страницу теперь можно сделать отсутствующей (обычно это означает страницу, которая была выгружена на диск, чтобы освободить место для некоторых других данных), что заставит процессор извлечь дескриптор для обработчика исключения ошибки страницы. Этот дескриптор, находящийся на второй странице таблицы, как обычно присутствует в памяти (если бы его не было, процессор бы дважды, а затем тройной отказал бы, что привело бы к выключению). Эти дополнительные циклы памяти отменяют требование блокировки памяти, выданное исходной недопустимой инструкцией (поскольку предполагается, что инструкции с ошибками могут быть перезапущены после возврата обработчика исключений). Обработчик исключения ошибки страницы должен быть изменен, однако, чтобы справиться с необходимостью предоставления отсутствующей страницы для первой половины таблицы дескрипторов прерывания, задачи, которую обычно не требуется выполнять.

Второй официальный обходной путь от Intel предлагал оставить все страницы в памяти, но пометить первую страницу только для чтения. Поскольку исходная недопустимая инструкция должна была вызвать цикл записи в память, этого достаточно, чтобы снова вызвать вмешательство обработчика отказа страницы. Этот вариант имеет то преимущество, что модификации, требуемые для обработчика отказа страницы, очень незначительны по сравнению с модификациями, необходимыми для первого варианта; в основном ему просто нужно перенаправить на обработчик неопределенного исключения, когда это необходимо. Однако этот вариант требует, чтобы сама операционная система не могла записывать страницы, доступные только для чтения (посредством установки глобального флага процессора), и не все ядра спроектированы таким образом; более свежие ядра на самом деле таковы, поскольку это тот же самый базовый механизм, который используется для реализации копирование при записи.

Были предложены дополнительные обходные пути, кроме официальных от Intel; во многих случаях они оказались столь же эффективными и намного более простыми в применении.[1] Самый простой способ заключался в том, чтобы просто пометить страницу, содержащую дескрипторы прерывания, как некэшируемую. Опять же, дополнительные циклы памяти, которые процессор был вынужден пройти для выборки данных из ОЗУ каждый раз, когда ему нужно было вызвать обработчик исключений, по-видимому, были всем, что было необходимо для предотвращения блокировки процессора. В этом случае никаких изменений в обработчике исключений не требовалось. И, хотя это не является строго необходимым, в этом случае было выполнено такое же разбиение таблицы дескрипторов прерывания, с пометкой как некэшируемая только первая страница. Это было сделано из соображений производительности, так как страница, содержащая большинство дескрипторов (а на самом деле, требуемых чаще), могла оставаться в кеше.

По неизвестным причинам эти дополнительные неофициальные обходные пути никогда не были одобрены Intel. Возможно, возникло подозрение, что они могут работать не со всеми затронутыми версиями процессоров.

Смотрите также

Рекомендации

  1. ^ а б c Коллинз, Роберт Р. (1 мая 1998 г.). "Ошибка Pentium F00F". Журнал доктора Добба. Получено 27 июля 2015.
  2. ^ а б Intel (1998). «81. Неверный операнд с заблокированной инструкцией CMPXCHG8B». Обновление спецификации процессора Pentium®, версия 041 [дата выпуска январь 1999 г.] (PDF). Санта-Клара, Калифорния, США: Intel. п. 51ж. Архивировано из оригинал (PDF ) 4 марта 2016 г.. Получено 27 июля 2015. Открытие этого обновления спецификации гласит:

    ПРОБЛЕМА: инструкция CMPXCHG8B сравнивает 8-байтовое значение в EDX и EAX с 8-байтовым значением в памяти (операнд назначения). Единственными допустимыми операндами назначения для этой инструкции являются операнды памяти. Если операнд назначения является регистром, процессор должен сгенерировать исключение недопустимого кода операции, выполнение инструкции CMPXCHG8B должно быть остановлено, а процессор должен выполнить обработчик исключения недопустимого кода операции. Эта ошибка возникает, если префикс LOCK используется с инструкцией CMPXCHG8B с (недопустимым) операндом назначения регистра. В этом случае процессор может не начать выполнение обработчика исключения недопустимого кода операции, поскольку шина заблокирована. Это приводит к зависанию системы. ВЫВОД: Если (недопустимый) операнд назначения регистра используется с инструкцией CMPXCHG8B и префиксом LOCK, система может зависнуть. Данные памяти не повреждены, и пользователь может выполнить сброс системы, чтобы вернуться к нормальной работе. Обратите внимание, что конкретная недопустимая кодовая последовательность, необходимая для возникновения этой ошибки, обычно не создается в ходе программирования, и Intel не знает, что такая последовательность создается коммерчески доступным программным обеспечением. Эта ошибка распространяется только на процессоры Pentium, процессоры Pentium с технологией MMX, процессоры Pentium OverDrive и процессоры Pentium OverDrive с технологией MMX. Процессоры Pentium Pro, Pentium II и процессоры i486TM и более ранние не затронуты ...

  3. ^ Ховерс, Онно; и другие. (8 ноября 1997 г.). "Ошибка Nieuwe Intel Pentium" [Новый Intel…] (ветка группы новостей, 38 сообщений от 22 авторов) (на голландском). Группа новостейnl.comp.hardware. Получено 27 июля 2015. Кроме того, это ошибка Intel Pentium. Daardoor - это полное пользовательское пространство, которое может быть связано с Pentium helemaal, что латентный сбой встретился с 1 инструкцией. Ошибка происходит для Intel Pentium и Intel Pentium MMX. Эта ошибка не используется для Intel Pentium Pro, Intel Pentium II, чипов AMD, Cyrix e.d. Эта ошибка используется только для нескольких пользователей, работающих с многопользовательской (оболочкой) системой на Intel Pentium. Op zo'n systeem kan elke user het systeem crashen…

дальнейшее чтение

внешняя ссылка