stringtranslate.com

Тройная ошибка

На архитектуре компьютера x86 тройная ошибка — это особый вид исключения , генерируемого центральным процессором , когда исключение возникает, когда центральный процессор пытается вызвать обработчик исключений двойной ошибки , который сам обрабатывает исключения, возникающие при попытке вызвать обычный обработчик исключений.

Процессоры x86 , начиная с 80286 , приведут к циклу выключения при обнаружении тройной ошибки. Это обычно приводит к тому, что аппаратное обеспечение материнской платы инициирует сброс ЦП, что, в свою очередь, вызывает перезагрузку всего компьютера. [1] [2]

Возможные причины тройных ошибок

Тройные ошибки указывают на проблему с ядром операционной системы или драйверами устройств . В современных операционных системах тройная ошибка обычно вызывается переполнением или недозаполнением буфера в драйвере устройства, который записывает поверх таблицы дескрипторов прерываний (IDT). Если IDT повреждена, то при следующем прерывании процессор не сможет вызвать ни необходимый обработчик прерываний, ни обработчик двойных ошибок, поскольку дескрипторы в IDT повреждены. [ необходима цитата ]

Виртуальные машины

В QEMU тройная ошибка приводит к созданию дампа виртуальной машины в консоли, при этом указатель инструкции устанавливается на инструкцию, вызвавшую первое исключение.

В VirtualBox тройная ошибка приводит к отображению пользователю ошибки Guru Meditation . Виртуальная машина в этом состоянии имеет большинство отключенных функций и не может быть перезапущена. Если открыт отладчик VirtualBox, выводится сообщение о том, что произошла тройная ошибка, за которым следует дамп регистра и разборка последней выполненной инструкции, аналогично выводу rgкоманды отладчика.

При использовании Intel VT-x тройная ошибка приводит к выходу виртуальной машины с причиной выхода 2. Причина выхода сохраняется в VMCS и может быть обработана программным обеспечением VMM.

Другие применения

Процессор Intel 80286 был первым процессором x86, который представил теперь повсеместно распространенный защищенный режим . Однако 286 не мог вернуться в базовый совместимый с 8086 « реальный режим » без сброса процессора, что можно было сделать только с помощью внешнего по отношению к ЦП оборудования. На IBM AT и совместимых с ним компьютерах задокументированный метод выполнения этого состоял в использовании специальной функции на контроллере клавиатуры Intel 8042 , которая утверждала бы вывод RESET процессора. Однако было обнаружено, что преднамеренное тройное сбойное состояние ЦП приводило к тому, что переход происходил намного быстрее (0,8 миллисекунд вместо 15+ миллисекунд) и более чисто, позволяя многозадачным операционным системам переключаться вперед и назад на высокой скорости. [3]

Некоторые ядра операционных систем, такие как Linux , все еще используют тройные ошибки в качестве последней попытки в процессе перезагрузки, если перезагрузка ACPI не удалась. Это делается путем установки регистра IDT в 0 и последующей выдачи прерывания. [1] Поскольку таблица теперь имеет длину 0, все попытки доступа к ней терпят неудачу, и процессор генерирует тройную ошибку.

Ссылки

  1. ^ ab Collins, Robert (2000). "Triple Faulting the CPU". Повышение производительности и приемы программирования . Архивировано из оригинала 2017-09-09 . Получено 2015-11-22 .
  2. ^ Коллинз, Роберт (2000). "ELEGANT RESET". Архивировано из оригинала 2017-09-09 . Получено 2017-09-09 .
  3. ^ Остерман, Ларри (2005-02-08). "Faster Syscall Trap redux". Веб-журнал Ларри Остермана . Блоги MSDN . Архивировано из оригинала 2017-09-09 . Получено 2010-07-23 .