Ogólny błąd ochrony
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:
- z segmentem kodu (CS), segmentem danych (DS) lub rejestrami ES, FS lub GS (dodatkowy segment); Lub
- dostęp do tablic deskryptorów, takich jak globalna tablica deskryptorów (GDT), tablica deskryptorów przerwań (IDT) i tablica deskryptorów lokalnych (LDT).
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