Protected mode of beveiligde modus, dat al aanwezig is sinds de 80286, is een toestand van een processor van de x86-architectuur. In beveiligde modus zijn er vier ringen waarvan de laagste de meeste privileges heeft, daarbij kan men andere ringen depriviligeren zodat ze bv. bepaalde instructies niet kunnen uitvoeren of zo bepaalde I/O-poorten niet kunnen gebruiken. Ook is het mogelijk om in de beveiligde modus te multitasken, iets wat voorheen nog niet mogelijk was op de x86-architectuur.

Een x86-processor start altijd op in real mode of reële modus. Dit is nodig vanwege compatibiliteit met de oorspronkelijke 8086, waarvoor MS-DOS is geschreven. Intel wilde ervoor zorgen dat MS-DOS nog altijd kon functioneren op een nieuwere Intel-processor. Ook is het zo dat in reële modus alleen de eerste megabyte kan gebruikt worden en hoewel het gebied erna wel bereikbaar is, is dit een overlappend gebied met het beginstuk van de eerste megabyte, hierdoor zijn er om beveiligde modus te betreden een aantal dingen te initialiseren: de twintigste adreslijn, de globale beschrijvingstabel en de beveiligde modus zelf.

Hoewel de beveiligde modus zeer interessant was, werd hij nog niet direct gebruikt. Dit kwam vooral door het feit dat de 80286 een ontwerpfout had, waarbij men niet terug kon keren naar de reële modus, iets wat eigenlijk zeer interessant was om te doen in die tijd, vanwege het feit dat men dan de reële modus kon instellen om vier gigabyte aan geheugen te gebruiken en toch het BIOS nog te kunnen gebruiken. Het BIOS werkte namelijk niet in de beveiligde modus.

Een omslachtige manier om dit probleem te omzeilen werkte met LOADALL.

Segmentdescriptors

bewerken

Een processor heeft naast de bekende 16-bits segmentregisters ook segmentdescriptors. De descriptors zijn voor een programma niet toegankelijk. Het besturingssysteem maakt echter een tabel waarin de waarden staan die in de segmentdescriptors komen te staan. Elke keer als er een segmentregister wordt geladen, zoekt de processor de bijbehorende gegevens voor de segmentdescriptor op. Hierdoor duurt het laden van een segmentregister vrij lang — veel langer dan in real mode.

De segmentdescriptors bevatten in de eerste plaats het basisadres waar de adressering begint. Dit adres heeft evenveel bits als er adreslijnen zijn, zodat het hele geheugen adresseerbaar is, terwijl men in real mode (met segmentregisters van 16 bits) niet veel verder komt dan 1 MiB.

Verder bevatten de segmentdescriptors gegevens voor virtueel geheugen en beveiligingsgegevens.

Protected mode binnengaan en verlaten

bewerken

Het is met de 80286 niet mogelijk om van de protected mode terug te keren naar de real mode. Onder DOS werd dat een probleem gevonden, want DOS werkt nu eenmaal in real mode. Men moest naar protected mode om het geheugen boven 1 MB te kunnen adresseren of andere taken uit te voeren, en daarna wilde men weer terug naar real mode. Om het laatste mogelijk te maken, werd er hardwarematig een reset gegenereerd.

Om de protected mode binnen te gaan, moet eerst de Global Descriptor Table (GDT) aangemaakt worden met minimaal drie ingangen: een null descriptor, een code segment descriptor en een data segment descriptor. Ook moet de 20e adreslijn (A20) aangezet worden om het gebruik van al de adreslijnen mogelijk te maken, zodat de CPU geheugen kan gebruiken boven de 1 megabyte. Na deze stappen uitgevoerd te hebben kan de PE-bit in het CR0-register aangezet worden en moet een far jump uitgevoerd worden om de instructiewachtlijst leeg te maken.

    lgdt [GDT]          ; Laad de globale descriptortabel.
    mov eax, cr0        ; 
    or eax, (1 << 0)    ; PE-bit is bit 0 van CR0
    mov cr0, eax        ;
    jmp 0x08:.SetCS     ; Stel het codesegment gelijk aan de tweede entry in de GDT en spring naar .SetCS

.SetCS:
    mov ax, 0x10        ; Alle segmentdescriptors worden gelijk aan de derde entry in de GDT.
    mov ds, ax          ; 
    mov es, ax          ; 
    mov fs, ax          ; 
    mov gs, ax          ;

Toen de 80386 uitgebracht werd, werd het mogelijk om weer terug te gaan naar de real mode door de segmentregisters met de waarden voor real mode te laden, eventueel A20 uit te zetten en de PE-bit (in het CR0-register) weer uit te zetten. Bij moderne besturingssystemen is daar echter geen behoefte meer aan.