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