Ogólny błąd ochrony

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

Ogólny błąd ochrony (ang. general protection fault) – w architekturze Intel x86 błąd pojawiający 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.

Przyczyny błędów[edytuj | edytuj kod]

Wyróżnia się na ogół cztery typy zdarzeń, które powodują powstanie tego błędu.

W systemie 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).

Błędy pamięci[edytuj | edytuj kod]

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

Błędy braku uprawnień[edytuj | edytuj kod]

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.

Błędne zachowanie[edytuj | edytuj kod]

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.

Błędy formatu[edytuj | edytuj kod]

Ogólny błąd ochrony może się pojawić, jeśli instrukcja załadowana przez procesor jest nieprawidłowa lub zbyt długa.

Techniczny opis przyczyn błędów[edytuj | edytuj kod]

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; skr. SS) zawiera selektor segmentu tylko do odczytu, wykonania lub segment pusty (ang. null segment)
    • segment kodu (ang. code segment; skr. 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 lub wyjątku 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 w 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, gdy CPL jest większy niż DPL dla bramy wywołania przerwania
    • selektor segmentu w gramie wywołania przerwania lub pułapki 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

Zobacz też[edytuj | edytuj kod]