Ошибка F0 в Pentium

Мы получили много писем от системных администраторов, обеспокоенных найденной в Pentium ошибкой F0. В этой заметке мы постараемся ответить на наиболее часто встречающиеся вопросы.

Что представляет собой ошибка F0?

При выполнении определенных машинных инструкций работа компьютера полностью останавливается. Единственный выход - кнопка Reset.

В каких процессорах выявлена ошибка?

Как утверждает Intel, во всех процессорах семейства P5, начиная от первого Pentium с тактовой частотой 60 МГц и до последних моделей с технологией MMX. В процессорах P6 (Pentium Pro и Pentium II) ошибка отсутствует.

Что вызывает ошибку?

Ошибка проявляется при выполнении инструкции с мнемоникой CMPXCHG8B (сравнить и обменять значениями 8 байт), впервые появившейся в Pentium. Она считывает 8 байт из памяти, сравнивает их значения с содержимым двух регистров и записывает его на место считанных данных.

Для чего вообще используется эта инструкция?

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

Почему система останавливается?

Чтобы предотвратить доступ к семафору во время его модификации, перед инструкцией CMPXCHG8B ставится префикс lock - байт F0 в шестнадцатеричном представлении. Он предоставляет процессору эксклюзивный контроль над памятью во время выполнения инструкции. Затем идет код самой команды и еще два байта, указывающие на местоположение семафора в памяти. Если этого адреса не существует, процессор пытается сигнализировать об ошибке. Однако ему это не удается, поскольку он уже занят блокировкой шины на время выполнения инструкции. Таким образом, машина перестает работать.

Кто может вызвать ошибку?

Поскольку для выполнения инструкции CMPXCHG8B не требуется никаких привилегий, опасность исходит практически от любого пользователя, который может пользоваться компилятором, создавать или загружать исполняемый файл. Байт-код Java ошибку вызвать не может, поскольку он интерпретируется.

Какие меры следует предпринять?

Intel разместила на своем Web-узле средства исправления для различных операционных систем. Однако обойти все защитные средства ОС достаточно легко, поэтому необходимо принять строгие меры предосторожности, "оградив" те машины, от которых напрямую зависит работа предприятия. Доверьте возможность компиляции, создания и загрузки исполняемых и DLL-файлов узкому кругу пользователей. Отключите средства управления ActiveX. Запретите пользователям запускать файлы в каталогах, предназначенных для записи работ. Ограничьте доступ к компиляторам и отладчикам (в частности, к программе DOS DEBUG и ее аналогам в Windows 95 и Windows NT).