Общая ошибка защиты
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Общая ошибка защиты ( 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
[ редактировать ]В Microsoft Windows общая ошибка защиты отображается на разных языках в зависимости от версии продукта:
Операционная система | Сообщение об ошибке | Примечания |
---|---|---|
Windows 3.0 | НЕУСТРАНИМАЯ ОШИБКА ПРИЛОЖЕНИЯ
Завершение текущего приложения. |
[ 1 ] |
Windows 3.1x | [Имя программы] вызвало общую ошибку защиты в модуле [имя модуля] по [адрес памяти]. | Это сообщение об ошибке (с тем же форматом оформления) в редких случаях может появляться и в более поздних версиях (95, 98 и Me). Текст этой ошибки также появляется в 95, 98 и Me, если нажать кнопку «Подробнее» или нажать Alt+D, с добавлением регистров, байтов в CS:EIP и дампа стека. |
Windows 95 Windows 98 Windows НТ 4.0 |
Эта программа выполнила недопустимую операцию и будет закрыта.
Если проблема не устранена, обратитесь к поставщику программы. |
Иногда в ошибке также говорится: «Закройте все программы, а затем перезагрузите компьютер», особенно если проблема более серьезная или система нестабильна, а обратный адрес указывает на DLL Windows или другие системные процессы. Если установлен отладчик, между кнопками «Закрыть» и «Подробности» также имеется кнопка «Отладка». |
Windows 2000 | [Название программы] вызвало ошибки и будет закрыто Windows. Вам нужно будет перезапустить программу.
Создается журнал ошибок. |
|
Windows Me | [Имя программы] вызвало ошибку в [Имя модуля]. [Название программы] закроется.
Если проблемы продолжают возникать, попробуйте перезагрузить компьютер. |
Если установлен отладчик, под кнопкой «Закрыть» также имеется кнопка «Отладка». Подробности по-прежнему можно просмотреть, нажав Alt+D и через файл Faultlog.txt. |
Windows ХР Windows Сервер 2003 Windows Сервер 2003 Р2 |
В [Название программы] возникла проблема, и ее необходимо закрыть. Приносим извинения за неудобства.
Если вы были заняты чем-то, информация, над которой вы работали, могла быть потеряна. [...] Для получения дополнительной информации об этой ошибке нажмите здесь . |
В сообщении об ошибке также есть возможность отправить сведения об ошибке в Microsoft для анализа. |
Windows Vista и более поздние версии, за исключением Windows 10 Windows Server 2008 и более поздние версии |
[Название программы] перестало работать.
Проблема привела к тому, что программа перестала работать корректно. Windows закроет программу и уведомит вас, если решение доступно. |
По умолчанию Windows отправляет сведения об ошибках в Microsoft для анализа, но систему можно настроить так, чтобы она либо не отправляла информацию, либо каждый раз спрашивала пользователя, что делать. |
Windows 10 Windows 11 |
Windows отправит сведения об ошибке в Microsoft для анализа. Пользователи с бизнес-лицензией могут настроить объем отправляемой информации. |
В Windows 95, 98 и Me появляется альтернативное сообщение об ошибке, которое чаще всего используется в программах Windows 3.x: «В вашей программе произошла ошибка. Чтобы продолжить работу, нажмите «Игнорировать» и сохраните свою работу в новом файле. выйдите из этой программы, нажмите «Закрыть». Вы потеряете информацию, которую вы ввели с момента последнего сохранения». Нажатие «Закрыть» приводит к появлению одного из приведенных выше сообщений об ошибке, в зависимости от версии Windows. «Игнорировать» тоже иногда делает то же самое.
Юникс
[ редактировать ]В Linux и других Unix об ошибках сообщается отдельно (например, ошибка сегментации для ошибок памяти).
Ошибки памяти
[ редактировать ]При ошибках памяти неисправная программа обращается к памяти , к которой ей не следует обращаться. Примеры включают в себя:
- Попытка записи в область памяти, доступную только для чтения.
- Попытка выполнить в памяти байты , которые не обозначены как инструкции.
- Попытка прочитать байты данных в памяти, которые обозначены как инструкции.
- Другие различные конфликты между обозначением части памяти и ее использованием.
Однако многие современные операционные системы реализуют свои схемы управления доступом к памяти посредством подкачки вместо сегментации, поэтому часто случается, что о недопустимых ссылках на память в таких операционных системах, как Windows, сообщается через ошибки страниц, а не через общие ошибки защиты. Операционные системы обычно предоставляют уровень абстракции (например, обработку исключений или сигналов), который скрывает любой внутренний механизм процессора, который использовался для возникновения ошибки доступа к памяти из программы, с целью предоставления стандартного интерфейса для обработки множества различных типов ошибок, генерируемых процессором. условия ошибки.
Что касается архитектуры x86, общие ошибки защиты специфичны для защиты на основе сегментации, когда речь идет о доступе к памяти. Однако общие ошибки защиты по-прежнему используются для сообщения о других нарушениях защиты (помимо нарушений доступа к памяти) при использовании подкачки, таких как использование инструкций, недоступных с текущего уровня привилегий (CPL).
Хотя теоретически операционная система может использовать как подкачку, так и сегментацию, по большей части распространенные операционные системы обычно полагаются на подкачку для большей части своих потребностей в управлении доступом к памяти.
Ошибки привилегий
[ редактировать ]На компьютере есть некоторые вещи, которые предназначены исключительно для использования операционной системой . Если программа, не являющаяся частью операционной системы, попытается использовать одну из этих функций, это может вызвать общую ошибку защиты.
Кроме того, существуют места хранения, зарезервированные как для операционной системы, так и для самого процессора. Вследствие их резервирования они доступны только для чтения и попытка записи в них данных непривилегированной программой приводит к ошибке.
Технические причины неисправностей
[ редактировать ]Общие ошибки защиты возникают в процессоре, когда встречается защищенная инструкция, которая превышает уровень разрешений текущей выполняющейся задачи, либо потому, что программа пользовательского режима пытается выполнить защищенную команду, либо потому, что операционная система выдала запрос, который может процессор в неопределенное состояние.
Общие ошибки защиты обнаруживаются и обрабатываются современными операционными системами. Обычно, если ошибка возникла в программе пользовательского режима, программа пользовательского режима завершается. Однако если неисправность возникла в основном драйвере системы или в самой операционной системе, операционная система обычно сохраняет диагностическую информацию либо в файл, либо на экран и прекращает работу. Он либо перезагружает компьютер, либо отображает экран с ошибкой , например « синий экран смерти» или панику ядра .
Превышены ограничения сегмента
[ редактировать ]Лимиты сегмента могут быть превышены:
- с регистрами сегмента кода (CS), сегмента данных (DS) или ES, FS или GS (дополнительный сегмент); или
- доступ к таблицам дескрипторов, таким как глобальная таблица дескрипторов (GDT), таблица дескрипторов прерываний (IDT) и локальная таблица дескрипторов (LDT).
Разрешения сегмента нарушены
[ редактировать ]Разрешения сегмента могут быть нарушены:
- переход к неисполняемым сегментам
- запись в сегменты кода или сегменты только для чтения
- чтение сегментов, предназначенных только для выполнения
Сегменты загружены незаконно
[ редактировать ]Это может произойти, когда:
- сегмент стека (SS) загружается с селектором сегмента для сегмента только для чтения, исполняемого файла, нулевого сегмента или сегмента с привилегией дескриптора, не соответствующей текущей привилегии в CS
- сегмент кода (CS), загруженный селектором сегмента для сегмента данных, системы или нулевого сегмента
- SS, DS, ES, FS или GS — это сегменты, в которые загружен селектор сегментов для системного сегмента.
- SS, DS, ES, FS или GS — это сегменты, загруженные с помощью селектора сегментов для сегмента кода, предназначенного только для выполнения.
- доступ к памяти с использованием регистров DS, ES, FS или GS, когда они содержат нулевой селектор
Переключение
[ редактировать ]Сбои в структуре сегмента состояния задачи (TSS) могут возникнуть в следующих случаях:
- переключение на занятую задачу во время вызова или команды перехода
- переключение на доступную задачу во время команды возврата прерывания (IRET)
- использование селектора сегмента на переключателе, указывающем на дескриптор TSS в LDT [ нужны разъяснения ]
Разнообразный
[ редактировать ]Другими причинами общих неисправностей защиты являются:
- попытка доступа к обработчику прерываний/исключений из виртуального режима 8086 дескриптора сегмента кода (DPL) обработчика , когда уровень привилегий больше нуля
- попытка записать единицу в зарезервированные биты CR4
- попытка выполнить привилегированные инструкции, когда текущий уровень привилегий (CPL) не равен нулю
- попытка выполнить одну инструкцию длиной более 15 байт (возможно, путем добавления к инструкции лишних префиксов) [ 2 ]
- запись в зарезервированный бит в MSR инструкции
- доступ к воротам, содержащим селектор нулевого сегмента
- выполнение программного прерывания, когда CPL больше, чем DPL, установленный для шлюза прерывания
- селектор сегмента в шлюзе вызова, прерывания или ловушки не указывает на сегмент кода
- нарушение правил привилегий
- включение пейджинга при отключении защиты
- ссылка на таблицу дескрипторов прерываний после прерывания или исключения, которое не является прерыванием, ловушкой или шлюзом задачи
- Устаревший SSE : операнд памяти не выровнен по 16 байтам.
Ссылки
[ редактировать ]- ^ «Устранение неполадок «Неустранимой ошибки приложения» в DrWatson» . Поддерживать . Майкрософт . 27 февраля 2014 г.
- ^ «Страница 223» . Проверено 24 сентября 2023 г.
Дальнейшее чтение
[ редактировать ]- Руководство разработчика программного обеспечения для архитектуры Intel – Том 3: Системное программирование