stringtranslate.com

Ошибка Пентиума F00F

Процессор Intel Pentium 75 МГц

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

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

Описание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. ^ abc Коллинз, Роберт Р. (1 мая 1998 г.). «Ошибка Pentium F00F». Журнал доктора Добба . Проверено 27 июля 2015 г.
  2. ^ ab «81. Неверный операнд с заблокированной инструкцией CMPXCHG8B». Обновление спецификаций процессора Pentium, версия 041 [Дата выпуска — январь 1999 г.] (PDF) . Санта-Клара, Калифорния, США: Корпорация Intel . 1998. стр. 51 ф . Номер заказа 242480-041. Архивировано из оригинала (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. ^ "Торвальдс/Линукс". Гитхаб . Архивировано из оригинала 23 июня 2022 г. Проверено 9 июля 2021 г.
  4. ^ Ховерс, Онно; и другие. (1997-11-08). «Nieuwe Intel Pentium Bug» [New Intel…] (тема в группе новостей, 38 сообщений от 22 авторов) (на голландском языке). Группа новостей : nl.comp.hardware . Проверено 27 июля 2015 г. Если я не знаю, что делать, это новая ошибка Intel Pentium. Вы можете потерять доступ к пользовательскому пространству Pentium из-за 1 инструкции. Ошибка связана с процессорами Intel Pentium и Intel Pentium MMX. Эта ошибка не связана с процессорами Intel Pentium Pro, Intel Pentium II, чипами AMD, Cyrix и этой ошибкой, и она связана с некоторыми людьми, работающими в многопользовательской (оболочке) системе на Intel Pentium. В системе может произойти сбой другого пользователя…

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

Внешние ссылки