# Mode protegit

El mode protegit és una mode operacional de les CPU compatibles x86 de la sèrie 80286 i posteriors. El mode protegit té un nombre de noves característiques dissenyades per millorar les multitasques i l'estabilitat del sistema, com protecció de memòria, i maquinari per a memòria virtual i de commutació de tasca. De vegades és abreujat com p-mode i també anomenat Protected Virtual Address Mode (Mode d'adreça virtual protegida) al manual de referència de programador del iAPX 286 d'Intel , (Nota, iAPX 286 és només un altre nom per al Intel 80286). Al 80386 i processadors de 32 bit s posteriors es va afegir un sistema de paginació que és part de la mode protegit.
La majoria dels sistemes operatius x86 moderns corren en mode protegit, incloent Linux, FreeBSD, OpenBSD, NetBSD, i Microsoft Windows 3.0 i posteriors. (Windows 3.0 també corria al mode real per a la compatibilitat amb les aplicacions de Windows 2.x).
L'altre mode operacional principal de l'286 i CPU posteriors és el mode real, una mode de compatibilitat cap enrere que desactiva les característiques pròpies de la mode protegit, dissenyat per permetre al programari vell córrer en els xips més recents. Com una especificació de disseny, tots els CPU x86 comencen en mode real en el moment de càrrega (boot time) per assegurar compatibilitat cap enrere amb els sistemes operatius heretats, excepte el fosc Intel 80376 dissenyat per a aplicacions encastades. Aquests processadors han de ser canviats a mode protegit per un programa abans que estigui disponible qualsevol característica d'aquesta mode. En ordinadors moderns, aquest canvi és generalment una de les primeres tasques realitzades pel sistema operatiu en el temps de càrrega.
Mentre que la multitasca en sistemes corrent en mode real és certament possible mediada per programari, les característiques de protecció de memòria de la mode protegit prevenen que un programa erroni pugui danyar la memòria "pròpia" d'una altra tasca o del nucli del sistema operatiu. El mode protegit també té suport de maquinari per interrompre un programa en execució i canviar el context d'execució a un altre, permetent pre-emptive Multitasking.

## Compatibilitat amb aplicacions de mode real

El Manual de Referència del Programador del iAPX 286 d'Intel indica que el mode protegit és només una coberta sobre el conjunt d'instruccions del 80186, i de fet, per als programadors d'aplicacions, el mode protegit 80286 no va afegir molt més enllà de tenir accés de fins a 16 MB de memòria física i d'1 GB de memòria virtual (512 MB global, 512 MB local). També era compatible amb el codi de la mode real a nivell binari, així que en teoria, el codi d'aplicació del 8086 i 80.186 podia córrer en mode protegit si seguia les regles, (encara que correria més lent que en la mode real perquè la càrrega de registres de segment és més lenta):
* No aritmètica de segment
* No ús d'instruccions privilegiades
* No accés directe de maquinari
* No escriptura al segment de codi (el que significa que codi automodificable mai està permès)
* No execució de dades (això, juntament amb la segmentació, proporciona una certa protecció de desbordament buffer)
* No presumpció que els segments es solapen
En realitat, gairebé tots els programes d'aplicacions del DOS violar aquestes regles, per la manca de reemplaçament de trucades de DOS o del BIOS, o a causa de l'insuficient nivell d'acompliment d'aquestes trucades. Les violacions més comunes eren aritmètica de segment i l'accés directe del maquinari. També algunes de les interrupcions del BIOS usaven números que van ser reservats per Intel. En altres paraules, el mode protegit era menys compatible amb aplicacions de DOS que amb aplicacions de mode real i, per tant, hi havia una necessitat del mode 8086 virtual, que va venir amb el 386.

## Nivells privilegiats

En mode protegit, hi ha quatre nivells de privilegi o anells, numerats de 0 a 3. El codi del nucli (kernel) del sistema operatiu, que necessitareu utilitzar instruccions privilegiades corre en l'anell 0, i les aplicacions de l'usuari corren normalment en l'anell 3.
El sistema operatiu d'assignar anells 1 i 2 a serveis de sistema, com protocols de xarxa o la gerència de finestres, que les aplicacions poden trucar. El fer això, li permet als serveis accedir directament les dades de l'aplicació, mentre que es protegeixen d'aquestes, així com el nucli queda protegit dels serveis. Tanmateix, això requereix, al sistema operatiu, fixar la protecció de memòria a nivell de segment (perquè en el 80386, la protecció de nivell de pàgina no pot distingir entre els anells 0, 1, i 2) i pot ser difícil si el sistema operatiu necessita ser portable a processadors amb suport per només dos anells. En comptes d'això, un sistema operatiu pot arribar a una protecció equivalent o més forta en córrer els serveis en l'anell 3 però en un diferent espai de direcció. Tanmateix, això costa més, al tenir una commutació de context més complexa a l'hora de la trucada, llevat que al servei li sigui donat un Task State Segment (segment d'estat de tasca) separat, el processador primer ha de canviar l'anell 0 per canviar l'espai de direcció, i després tornar a l'anell 3 per executar el servei.
El processador comprova nivells de privilegi en les següents situacions. Si el codi que corre no té prou privilegis, el resultat és generalment una excepció que el sistema operatiu pot gestionar, però també hi ha les instruccions que fan els mateixos controls sense aixecar excepcions.
* Instrucció privilegiada. Algunes instruccions només es poden executar en l'anell 0: per exemple LGDT (Load Global Descriptor Table) (Càrrega Taula Global de Descriptors), que pot redefinir segments arbitràriament i, per tant, vèncer el mecanisme de protecció. POPF (Pop Flags des de la pila) sempre és permès, però només pot canviar el camp IOPL des de l'anell 0.
* Entrada/sortida. El nivell de privilegi requerit per a les instruccions d'E/S i per modificar el flag d'interrupció és definit mitjançant el camp IOPL del registre EFLAGS. Fins i tot si el nivell actual de privilegis no és suficient, encara pot permetre E/S a ports específics via el mapa de bits de permisos d'I/O en el segment d'estat de tasca (no suportat pel 80.286).
* Carregar un registre de segment, far jumps i trucades a subrutines. Cada segment té un descriptor que defineix el descriptor privilege level (DPL) (nivell de privilegi del descriptor) requerit per a usar aquest segment. El valor del selector carregat en un registre de segment també codifica un requestor's privilege level (RPL) (nivell de privilegi del sol·licitant), que ha de ser fixat amb la instrucció ARP, per marcar els selectors rebuts des codi menys privilegiat. El processador fa diferents comprovacions per accessos de les dades, la commutació de la pila, transferències de control directes, i transferències de control indirectes per mitjà d'una porta.
* Retornant a codi menys privilegiat. El processador neteja tots els registres de segments que continguen selectors que codifiquen en el nou nivell de privilegi que no haguessin pogut carregar allà per si mateixos.
* La paginació (no suportada pel 80.286). Un bit a cada entrada de taula de pàgina controla si la pàgina es pot utilitzar només en els anells 0, 1, i 2 (mode supervisor), o també en l'anell 3 (mode usuari).
El RPL en el registre CS (segment de codi) és sempre el nivell actual de privilegi. La lectura d'aquest registre no pot ser atrapada, el que complica la virtualització nativa de sistemes operatius, ja que aquests normalment esperen tenir l'anell 0 per si mateixos. Veure virtualització x86.

## Extensions del 386 al mode protegit

Aquestes inclouen:
* Paginació
* Offsets de segment de 32 bits (aquests segments i la paginació van fer possible, en el 80386, fer un espai de direcció plànol de 32 bits utilitzat en sistemes operatius moderns)
* Espai de direcció físic de 32 bits (aquesta extensió no és present en els processadors 80386 que tenen un bus tipus 80286, per exemple el 80386SX)
* Capacitat de retornar a la mode real
* Mode 8086 virtual
* Bitmaps amb permisos d'I/O
Algunes d'elles van usar el que estava documentat com bits reservats en l'anterior processador 286 al manual de referència del programador del iAPX 286 d'Intel .

## Vegeu també

* Mode real - Mode irreal - Mode 8086 virtual - Mode protegit - Mode de Gerència del Sistema - Mode llarg
* X86
* Llenguatge assemblador x86
* Anells (seguretat informàtica)

## Referències

* The Intel Microprocessors (8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro Processor, Pentium II, Pentium II, Pentium III, and Pentium 4) Architecture, Programming, and Interfacing. Barry B. Brey
* Intel Corporation (1985). iAPX 286/10 High Performance Microprocessor with Memory Management and Protection (80286-10, 80286-8, 80286-6). Order number 210253-009. In Intel Corporation (1986), Microsystem Components Handbook, Volume I: Microprocessors, ISBN 1-55512-001-6, order number 230843 (both volums).

## Enllaços externs

* http://x86.ddj.com/articles/pmbasics/tspec_a1_doc.htm