F0 0F C7 C8
F0 0F C7 C8 — последовательность байтов, формирующих недействительную машинную команду процессоров семейства x86. В процессорах Pentium MMX и Pentium OverDrive, вследствие аппаратной недоработки, команда, будучи выполненной на любом уровне привилегий, приводила к мёртвому зависанию процессора, что отрицательно сказывалось на надёжности системы в целом.
Описание
Инструкция представляет собой команду:
lock cmpxchg8b eax
Операндом может быть любой другой регистр помимо eax. cmpxchg8b используется для сравнения содержимого пары регистров eax и edx с 8 байтами содержимого некоторого участка памяти. При этом происходит попытка поместить 8-байтовый результат в 4-байтный регистр.
Сама по себе эта команда просто вызывает исключение, однако при сочетании с префиксом lock (он используется для предотвращения обращения двух процессоров к одному и тому же участку памяти одновременно) обработчик исключений не вызывается, процессор перестает обрабатывать прерывания и для приведения его в рабочее состояние требуется перезагрузка.
Для выполнения этой инструкции не требуется наличия особых привилегий, и, ввиду высокого уровня распространенности процессоров Intel, проблема была серьёзной. Хотя она не наносила никакого непоправимого урона аппаратному обеспечению, но могла также быть причиной потери данных в тех случаях, когда сбой процессора возникал во время выполнения операции записи на диск при неочищенном буфере, выполнении прерывания или другой неатомарной операции.
Методы решения
- Для ядра Linux, совместно с Intel был разработан патч, устраняющий эту ошибку
- Компания Microsoft также выпустила патчи для своих операционных систем семейства Windows (см. KB163852)
- Для операционной системы OS/2 патч был выпущен фирмой IBM в виде специального базового драйвера CMPXCHG8.SYS, вызов которого можно было прописать в файл конфигурации системы config.sys
- Начиная с процессора Pentium Pro ошибка была исправлена на аппаратном уровне.
- Компания Intel производила бесплатную замену дефектных процессоров.
См. также
Ссылки
- Intel erratum
- CNET Article
- The Pentium F00F Bug: Workarounds for a nasty problem, детальное описание и способы решения