Jump to content

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

Процессор Интел Пентиум

Ошибка 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). Ошибка также относится к кодам операций, заканчивающимся на C9 через 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. ^ Перейти обратно: а б с Коллинз, Роберт Р. (1 мая 1998 г.). «Ошибка Pentium F00F» . Журнал доктора Добба . Проверено 27 июля 2015 г.
  2. ^ Перейти обратно: а б «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. ^ Ховерс, Онно; и др. (11 ноября 1997 г.). «Новая ошибка Intel Pentium» [New Intel…] (тема телеконференции, 38 сообщений от 22 авторов) (на голландском языке). Группа новостей : nl.comp.hardware . Проверено 27 июля 2015 г. Если вы еще об этом не слышали, то это новая ошибка Intel Pentium. Это позволяет из пользовательского пространства полностью вывести из строя Pentium с помощью одной инструкции. Ошибка возникает на процессорах Intel Pentium и Intel Pentium MMX. Ошибка не возникает на Intel Pentium Pro, Intel Pentium II, чипах AMD, Cyrix и т. д. Эта ошибка важна только для некоторых людей, которые используют многопользовательскую (оболочку) систему на Intel Pentium. В такой системе любой пользователь может привести к сбою системы...

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

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 5c322f08cf8897011fe8e7d0e20c11ae__1722342360
URL1:https://arc.ask3.ru/arc/aa/5c/ae/5c322f08cf8897011fe8e7d0e20c11ae.html
Заголовок, (Title) документа по адресу, URL1:
Pentium F00F bug - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)