Общая ошибка защиты ( GPF ) в архитектуре набора команд x86 (ISA) — это ошибка (тип прерывания ), инициируемая определенными ISA механизмами защиты в ответ на нарушение доступа, вызванное каким-либо работающим кодом либо в ядре , либо в пользовательская программа. Этот механизм впервые описан в руководствах и технических описаниях Intel для процессора Intel 80286 , который был представлен в 1983 году; он также описан в разделе 9.8.13 справочного руководства для программиста Intel 80386 от 1986 года. Общий сбой защиты реализуется как прерывание ( вектор номер 13 (0Dh)). Некоторые операционные системы могут также классифицировать некоторые исключения, не связанные с нарушениями доступа, такие как исключения недопустимых кодов операций , как общие ошибки защиты, даже если они не имеют ничего общего с защитой памяти. Если ЦП обнаруживает нарушение защиты, он прекращает выполнение кода и отправляет прерывание GPF. В большинстве случаев операционная система удаляет завершившийся сбой процесс из очереди выполнения, сигнализирует пользователю и продолжает выполнение других процессов. Однако если операционной системе не удается обнаружить общую ошибку защиты, т. е. происходит еще одно нарушение защиты до того, как операционная система возвращается из предыдущего прерывания GPF, ЦП сигнализирует двойную ошибку , останавливая операционную систему. Если произойдет еще один сбой ( тройной сбой ), ЦП не сможет восстановиться; начиная с 80286, ЦП переходит в специальное состояние остановки, называемое «Выключение», выйти из которого можно только посредством аппаратного сброса . IBM PC AT , первая ПК-совместимая система, содержащая 80286, имеет аппаратное обеспечение, которое определяет состояние выключения и автоматически перезагружает процессор, когда оно происходит. Все потомки ПК АТ делают то же самое, поэтому в ПК тройная ошибка вызывает немедленный сброс системы.
В Microsoft Windows общая ошибка защиты отображается на разных языках в зависимости от версии продукта:
В Windows 95, 98 и Me появляется альтернативное сообщение об ошибке, которое используется в основном с программами Windows 3.x: «В вашей программе произошла ошибка. Чтобы продолжить работу, нажмите «Игнорировать» и сохраните свою работу в новом файле. выйдите из этой программы, нажмите «Закрыть». Вы потеряете информацию, которую вы ввели с момента последнего сохранения». Нажатие «Закрыть» приводит к появлению одного из приведенных выше сообщений об ошибке, в зависимости от версии Windows. «Игнорировать» тоже иногда делает то же самое.
В Linux и других Unix об ошибках сообщается отдельно (например, ошибка сегментации для ошибок памяти).
При ошибках памяти неисправная программа обращается к памяти , к которой ей не следует обращаться. Примеры включают в себя:
Однако многие современные операционные системы реализуют свои схемы управления доступом к памяти посредством подкачки вместо сегментации, поэтому часто случается, что о недопустимых ссылках на память в таких операционных системах, как Windows, сообщается через ошибки страниц , а не через общие ошибки защиты. Операционные системы обычно предоставляют уровень абстракции (например, обработку исключений или сигналов), который скрывает любой внутренний механизм процессора, который использовался для возникновения ошибки доступа к памяти из программы, с целью предоставления стандартного интерфейса для обработки множества различных типов ошибок, генерируемых процессором. условия ошибки.
Что касается архитектуры x86, общие ошибки защиты специфичны для защиты на основе сегментации, когда речь идет о доступе к памяти. Однако общие ошибки защиты по-прежнему используются для сообщения о других нарушениях защиты (помимо нарушений доступа к памяти) при использовании подкачки, таких как использование инструкций, недоступных с текущего уровня привилегий (CPL).
Хотя теоретически операционная система может использовать как подкачку, так и сегментацию, по большей части распространенные операционные системы обычно полагаются на подкачку для большей части своих потребностей в управлении доступом к памяти.
На компьютере есть некоторые вещи, которые предназначены исключительно для использования операционной системой . Если программа, не являющаяся частью операционной системы, попытается использовать одну из этих функций, это может вызвать общую ошибку защиты.
Кроме того, существуют места хранения, зарезервированные как для операционной системы, так и для самого процессора. Вследствие их резервирования они доступны только для чтения и попытка записи в них данных непривилегированной программой приводит к ошибке.
Общие ошибки защиты возникают в процессоре, когда встречается защищенная инструкция, которая превышает уровень разрешений текущей выполняющейся задачи, либо потому, что программа пользовательского режима пытается выполнить защищенную команду, либо потому, что операционная система выдала запрос, который может поставить процессор в неопределенное состояние.
Общие ошибки защиты обнаруживаются и обрабатываются современными операционными системами. Обычно, если ошибка возникла в программе пользовательского режима, программа пользовательского режима завершается. Однако если неисправность возникла в основном драйвере системы или в самой операционной системе, операционная система обычно сохраняет диагностическую информацию либо в файл, либо на экран и прекращает работу. Он либо перезагружает компьютер, либо отображает экран с ошибкой , такой как «синий экран смерти» или паника ядра .
Лимиты сегмента могут быть превышены:
Разрешения сегмента могут быть нарушены:
Это может произойти, когда:
Сбои в структуре сегмента состояния задачи (TSS) могут возникнуть в следующих случаях:
Другими причинами общих неисправностей защиты являются: