Ogólny błąd ochrony
Z Wikipedii
Ogólny błąd ochrony (ang. general protection fault) w architekturze Intel x86 jest błędem pojawiającym się, gdy bieżąco wykonywany program komputerowy w jakiś sposób narusza zasady sprzętu, na którym jest wykonywany. Te zasady mają za zadanie chronić dane i inne programy przed oczywistymi i potencjalnie katastrofalnymi błędami wykonywania. Błędy, które powodują wystąpienie ogólnego błędu ochrony, są zazwyczaj nieodwracalne i uważa się, że najbezpieczniejszą reakcją na nie jest przerwanie programu.
Spis treści |
[edytuj] Przyczyny błędów
Wyróżnia się na ogół cztery typy zdarzeń, które powodują powstanie tego błędu.
W Microsoft Windows każde z nich powoduje zgłoszenie komunikatu "ogólny błąd ochrony". W systemach takich jak Unix lub Linux, błędy te są zgłaszane osobno (np. segmentation fault w przypadku błędów pamięci).
[edytuj] Błędy pamięci
Ten przypadek zachodzi, gdy program próbuje wykonać operację na części pamięci komputera, do której nie powinien mieć dostępu. Obejmuje on:
- Pisanie do pamięci tylko do odczytu (ang. read-only)
- Próbę wykonania bajtów z pamięci, która nie jest przeznaczona na instrukcje
- Próbę odczytania danych z pamięci przeznaczonej na instrukcje
- Inne konflikty pomiędzy przeznaczeniem pamięci a jej użytkowaniem przez program
[edytuj] Błędy braku uprawnień
W komputerze są obszary, które są zarezerwowane do wyłącznego użytku systemu operacyjnego. Jeśli program, który nie jest częścią systemu operacyjnego próbuje użyć któregoś z nich, może spowodować to powstanie błędu ochrony.
[edytuj] Błędne zachowanie
Specyfikacja architektury Intela zawiera pewne konwencje, do których programy powinny się stosować, przeważnie ze względu na ochronę poprawności danych w programach i pomiędzy nimi. Program, który ich nie przestrzega, może spowodować powstanie ogólnego błędu ochrony.
[edytuj] Błędy formatu
Ogólny błąd ochrony może się pojawić, jeśli instrukcja załadowana przez procesor jest nieprawidłowa lub zbyt długa.
[edytuj] Techniczny opis przyczyn błędów
Ogólny błąd ochrony może zostać wywołany z wielu różnych powodów:
- błędy naruszenia segmentacji poprzez przekroczenie granic segmentu
- przy użyciu rejestrów CS, DS, ES, FS, lub GS,
- poprzez dostęp do tablic deskryptorów (takich jak globalna tablica deskryptorów - GDT, tablica deskryptorów przerwań - IDT, lub lokalna tablica deskryptorów - LDT),
- błędy naruszenia segmentacji poprzez złamanie reguł dostępu do segmentu
- skok do kodu w segmencie oznaczonym jak niewykonywalny (ang. nonexecutable segments)
- zapis do segmentu kodu lub do segmentów tylko do odczytu
- czytanie z segmentów przeznaczonych tylko do wykonania (ang. execute-only segments)
- nieprawidłowa zawartość rejestrów segmentowych
- segment stosu (ang. stack segment - SS) zawiera selektor segmentu tylko do odczytu, wykonania lub segment pusty (ang. null segment)
- segment kodu (ang. code segment - CS) zawiera selektor segmentu danych lub segmentu pustego
- SS, DS, ES, FS, GS zawiera selektor segmentu wskazujący na segment należący do systemu operacyjnego
- DS, ES, ES, FS, GS zawiera selektor segmentu wskazujący na segment tylko do wykonania
- dostęp do pamięci przy użyciu DS, ES, FS, lub GS, gdy zawierają one zerowy selektor
- przełączanie zadań (TSS)
- przełączanie do zajętego zadania podczas wywołania lub skoku
- przełączanie do dostępnego zadania podczas IRET
- inne
- próba dostępu do obsługi przerwania (ang. interrupt) lub wyjątku (ang. exception) w trybie wirtualnym v86 gdy DPL segmentu kodu jest większe od 0.
- próba zapisu 1 do zarezerwowanych bitów CR4
- próba wykonania uprzywilejowanej instrukcji przy poziomie uprzywilejowania (ang. current privilege level - CPL) różnym od 0
- zapis zarezerwowanego bitu w MSR
- dostęp do bramy zawierającej zerowy selektor segmentu
- wykonanie przerwania programowego (ang. software interrupt) gdy CPL jest większy niż DPL dla bramy wywołania przerwania
- selektor segmentu w gramie wywołania (ang. call), przerwania (ang. interrupt) lub pułapki (ang. trap) nie wskazuje na segment kodu
- próba załadowania do procesora rozkazu dłuższego niż 15 bajtów
- przekroczenie uprawnień
- włączenie stronicowania pamięci z równoczesnym wyłączeniem ochrony pamięci
Na podstawie: Intel Architecture Software Developer's Manual Volume 3: System Programming