Ogólny błąd ochrony

Error message in a white dialog box stating "UNRECOVERABLE APPLICATION ERROR: Terminating current application."
Ogólny komunikat o błędzie dotyczący ogólnego błędu ochrony (nieodwracalny błąd aplikacji) w systemie Windows 3.0
Error message for a general protection fault in Windows 3.1x
Przykładowy komunikat o błędzie dotyczący ogólnego błędu ochrony w systemie Windows 3.1x

Ogólny błąd ochrony ( GPF ) w architekturze zestawu instrukcji x86 (ISA) to błąd (rodzaj przerwania ) zainicjowany przez mechanizmy ochrony zdefiniowane przez ISA w odpowiedzi na naruszenie dostępu spowodowane przez działający kod w jądrze lub program użytkownika. Mechanizm został po raz pierwszy opisany w instrukcjach i arkuszach danych Intela dla Intel 80286 , który został wprowadzony w 1983 roku; jest to również opisane w rozdziale 9.8.13 w podręczniku programisty Intel 80386 z 1986 roku. Ogólny błąd ochrony jest realizowany jako przerwanie ( wektor numer 13 (0Dh)). Niektóre systemy operacyjne mogą również klasyfikować niektóre wyjątki niezwiązane z naruszeniami dostępu, takie jak wyjątki nielegalnego kodu operacji , jako ogólne błędy ochrony, mimo że nie mają one nic wspólnego z ochroną pamięci. Jeśli procesor wykryje naruszenie ochrony, przestaje wykonywać kod i wysyła przerwanie GPF. W większości przypadków system operacyjny usuwa proces, który zakończył się niepowodzeniem , z kolejki wykonania, sygnalizuje użytkownikowi i kontynuuje wykonywanie innych procesów. Jeśli jednak systemowi operacyjnemu nie uda się przechwycić ogólnego błędu ochrony, tj. nastąpi kolejne naruszenie ochrony przed powrotem systemu operacyjnego z poprzedniego przerwania GPF, CPU sygnalizuje podwójny błąd , zatrzymując system operacyjny. Jeśli wystąpi jeszcze jedna awaria ( potrójna awaria ), procesor nie będzie w stanie się zregenerować; od 80286 procesor wchodzi w specjalny stan zatrzymania zwany „Shutdown”, z którego można wyjść tylko poprzez reset sprzętowy . IBM PC AT , pierwszy system kompatybilny z komputerami PC , który zawiera 80286, ma sprzęt, który wykrywa stan wyłączenia i automatycznie resetuje procesor, gdy ten wystąpi. Wszyscy potomkowie PC AT robią to samo, więc w komputerze PC potrójna usterka powoduje natychmiastowe zresetowanie systemu.

Konkretne zachowanie

W systemie Microsoft Windows ogólny błąd ochrony jest przedstawiany w różnych językach, w zależności od wersji produktu:

System operacyjny Komunikat o błędzie Notatki
Okna 3.0 NIENAPRAWALNY BŁĄD APLIKACJI

Zakończenie bieżącej aplikacji.

Windows 3.1x [Nazwa programu] spowodowała ogólny błąd ochrony w module [nazwa modułu] pod adresem [adres pamięci]. Ten komunikat o błędzie (z tym samym formatem projektu) może również pojawić się w późniejszych wersjach (95, 98 i Me) w rzadkich przypadkach. Tekst tego błędu pojawia się również w 95, 98 i Me, jeśli kliknięto przycisk „Szczegóły” lub naciśnięto kombinację klawiszy Alt+D.


Windows 95 Windows 98 Windows NT 4.0
Ten program wykonał nieprawidłową operację i zostanie zamknięty.

Jeśli problem będzie się powtarzał, skontaktuj się z dostawcą programu.

Windowsa 2000 [Nazwa programu] wygenerował błędy i zostanie zamknięty przez system Windows. Będziesz musiał ponownie uruchomić program.

Tworzony jest dziennik błędów.

Windows Me [Nazwa programu] spowodowała błąd w [Nazwa modułu]. [Nazwa programu] zostanie teraz zamknięte.

Jeśli nadal występują problemy, spróbuj ponownie uruchomić komputer.



Windows XP Windows Server 2003 Windows Server 2003 R2
[Nazwa programu] napotkał problem i musi zostać zamknięty. Przepraszamy za niedogodności.

Jeśli byłeś w trakcie czegoś, informacje, nad którymi pracowałeś, mogą zostać utracone.

[...]

Aby uzyskać więcej informacji na temat tego błędu, kliknij tutaj .

Komunikat o błędzie zawiera również opcję wysłania szczegółów błędu do firmy Microsoft w celu analizy.

Windows Vista i nowsze, z wyjątkiem Windows 10 Windows Server 2008 i nowsze
[Nazwa programu] przestała działać.

Wystąpił problem, który spowodował, że program przestał działać poprawnie. System Windows zamknie program i powiadomi o dostępności rozwiązania.

Domyślnie system Windows wysyła szczegóły błędu do firmy Microsoft w celu analizy, ale system można skonfigurować tak, aby nie wysyłał lub za każdym razem pytał użytkownika, co ma zrobić.
Okna 10 System Windows wyśle ​​szczegóły błędu do firmy Microsoft w celu analizy. Użytkownicy z licencją biznesową mogą konfigurować ilość wysyłanych informacji.

W systemach Unix i Linux błędy są zgłaszane oddzielnie (np. błąd segmentacji dla błędów pamięci).

Błędy pamięci

W przypadku błędów pamięci program powodujący błąd uzyskuje dostęp do pamięci , do której nie powinien mieć dostępu. Przykłady obejmują:

  • Próba zapisu w części pamięci tylko do odczytu
  • Próba wykonania bajtów w pamięci, które nie są oznaczone jako instrukcje
  • Próba odczytania jako danych bajtów w pamięci, które są oznaczone jako instrukcje
  • Inne różne konflikty między oznaczeniem części pamięci a jej wykorzystaniem

Jednak wiele nowoczesnych systemów operacyjnych implementuje swoje schematy kontroli dostępu do pamięci poprzez stronicowanie zamiast segmentacji, dlatego często nieprawidłowe odwołania do pamięci w systemach operacyjnych, takich jak Windows, są zgłaszane jako błędy strony zamiast ogólnych błędów ochrony . Systemy operacyjne zazwyczaj zapewniają warstwę abstrakcji (taką jak obsługa wyjątków lub sygnały), która ukrywa jakikolwiek wewnętrzny mechanizm procesora użyty do zgłoszenia błędu dostępu do pamięci z programu, w celu zapewnienia standardowego interfejsu do obsługi wielu różnych typów generowanych przez procesor warunki błędu.

Jeśli chodzi o architekturę x86, ogólne błędy ochrony są specyficzne dla ochrony opartej na segmentacji, jeśli chodzi o dostęp do pamięci. Jednak ogólne błędy ochrony są nadal używane do zgłaszania innych naruszeń ochrony (oprócz naruszeń dostępu do pamięci) podczas korzystania ze stronicowania, takich jak użycie instrukcji niedostępnych z bieżącego poziomu uprawnień (CPL ) .

Chociaż teoretycznie jest możliwe, aby system operacyjny wykorzystywał zarówno stronicowanie, jak i segmentację, w większości popularne systemy operacyjne zazwyczaj polegają na stronicowaniu w przypadku większości swoich potrzeb w zakresie kontroli dostępu do pamięci.

Błędy uprawnień

Na komputerze są pewne elementy, które są zarezerwowane do wyłącznego użytku systemu operacyjnego . Jeśli program, który nie jest częścią systemu operacyjnego, spróbuje użyć jednej z tych funkcji, może to spowodować ogólny błąd ochrony.

Dodatkowo istnieją miejsca pamięci, które są zarezerwowane zarówno dla systemu operacyjnego, jak i dla samego procesora. W wyniku ich rezerwacji są one tylko do odczytu i próba zapisania danych przez nieuprzywilejowany program kończy się błędem.

Techniczne przyczyny usterek

Ogólne błędy ochrony są zgłaszane przez procesor w przypadku napotkania chronionej instrukcji, która przekracza poziom uprawnień aktualnie wykonywanego zadania, ponieważ program w trybie użytkownika próbuje wykonać chronioną instrukcję lub system operacyjny wysłał żądanie, które spowodowałoby procesor w nieokreślony stan.

Ogólne błędy ochrony są wykrywane i obsługiwane przez nowoczesne systemy operacyjne. Generalnie, jeśli błąd powstał w programie trybu użytkownika, program trybu użytkownika zostaje zakończony. Jeśli jednak usterka powstała w głównym sterowniku systemu lub w samym systemie operacyjnym, system operacyjny zwykle zapisuje informacje diagnostyczne w pliku lub na ekranie i przestaje działać. Powoduje ponowne uruchomienie komputera lub wyświetlenie ekranu błędu , takiego jak niebieski ekran śmierci lub panika jądra .

Przekroczono limity segmentów

Limity segmentów mogą zostać przekroczone:

Naruszono uprawnienia segmentu

Uprawnienia do segmentu mogą zostać naruszone przez:

  • przeskakiwanie do niewykonywalnych segmentów
  • zapisywanie do segmentów kodu lub segmentów tylko do odczytu
  • odczytywanie segmentów tylko do wykonania

Segmenty załadowane nielegalnie

Może się to zdarzyć, gdy:

  • segment stosu (SS) jest ładowany z selektorem segmentu dla segmentu tylko do odczytu, wykonywalnego, pustego lub segmentu z uprawnieniami deskryptora niezgodnymi z bieżącymi uprawnieniami w CS
  • segment kodu (CS) załadowany z selektorem segmentu dla danych, systemu lub segmentu zerowego
  • SS, DS, ES, FS lub GS to segmenty ładowane za pomocą selektora segmentu dla segmentu systemowego
  • SS, DS, ES, FS lub GS to segmenty ładowane z selektorem segmentu dla segmentu kodu tylko do wykonania
  • dostęp do pamięci za pomocą rejestrów DS, ES, FS lub GS, gdy zawierają one selektor zerowy

Przełączanie

Błędy mogą wystąpić w strukturze segmentu stanu zadania (TSS), gdy:

  • przełączanie do zajętego zadania podczas połączenia lub instrukcji skoku
  • przełączanie do dostępnego zadania podczas wykonywania instrukcji przerwania powrotu (IRET).
  • za pomocą selektora segmentu na przełączniku wskazującym deskryptor TSS w LDT [ wymagane wyjaśnienie ]

Różnorodny

Inne przyczyny ogólnych błędów zabezpieczeń to:

  • próba uzyskania dostępu do programu obsługi przerwań/wyjątków z wirtualnego trybu 8086 , gdy poziom uprawnień deskryptora segmentu kodu (DPL) programu obsługi jest większy od zera
  • próbując zapisać jedynkę w zarezerwowanych bitach CR4
  • próba wykonania uprzywilejowanych instrukcji, gdy bieżący poziom uprawnień (CPL) nie wynosi zero
  • zapis do zarezerwowanego bitu w instrukcji MSR
  • dostęp do bramki zawierającej zerowy selektor segmentu
  • wykonanie przerwania programowego, gdy CPL jest większe niż DPL ustawione dla bramki przerwania
  • selektor segmentu w bramce wywołania, przerwania lub pułapki nie wskazuje segmentu kodu
  • naruszenie zasad przywilejów
  • włączenie stronicowania przy jednoczesnym wyłączeniu ochrony
  • odwoływanie się do tablicy deskryptorów przerwań następujących po przerwaniu lub wyjątku, który nie jest przerwaniem, pułapką ani bramką zadania
  • Starsze SSE : operand pamięci nie jest wyrównany do 16 bajtów.

Dalsza lektura

  • Podręcznik dewelopera oprogramowania architektury Intel — tom 3: Programowanie systemu