# Protecció de memòria

La protecció de memòria, de l'anglès memory protection o mprotection, és un mètode per controlar l'ús de memòria en un ordinador, i és part essencial de pràcticament tots els sistemes operatius moderns. El principal propòsit de la protecció de memòria és evitar que un procés en un sistema operatiu accedeixi a la memòria que no li ha estat assignada. Així poden evitar-se problemes durant l'execució del programari, i també s'evita que programari maligne accedeixi als recursos del sistema.

## Mètodes
### Segmentació

La segmentació (segmentation en anglès) fa referència a la divisió de la memòria d'un ordinador en segments.
L'arquitectura del x86 compta amb diferents opcions per a la segmentació per qui desitgi protecció de memòria en aquesta arquitectura. En l'arquitectura del x86, la Global Descriptor Table i la Local Descriptor Table es poden utilitzar per referenciar segments en la memòria de l'ordinador. Els punters als segments de memòria en els processadors x86 també poden emmagatzemar-se en els registres de segments del processador. Inicialment el x86 tenia 4 registres de segments: CS (code segment), SS (stack segment), DS (data segment) i ES (extra segment); per afegir-se posteriorment dos registres més – FS i GS.

### Paginació

Aquest concepte, conegut en anglès com Paging, es basa a dividir l'espai d'adreces de memòria en petites peces idèntiques anomenades pàgines. Usant un mecanisme de memòria virtual s'aconsegueix que cada pàgina resideixi en qualsevol ubicació dins de la memòria física, o pugui ser marcada com a protegida. La memòria virtual possibilita tenir un espai d'adreces de memòria lineal i usar-la per accedir a blocs fragmentats al llarg de l'espai d'adreces de memòria física.
La majoria de les arquitectures dels ordinadors basats en pàgines, entre ells l'arquitectura del x86, fan ús de la protecció de memòria.
S'utilitza una taula de pàgines per associar la memòria virtual amb la memòria física. La taula de pàgines resulta transparent durant el procés. Les taules de memòria faciliten l'assignació de memòria nova, atès que cada pàgina pot ser assignada des de qualsevol memòria física.
Aquesta solució impedeix que una aplicació accedeixi a una pàgina que no li ha estat explícitament assignada, perquè totes les adreces de memòria, fins i tot les aleatòries, que són utilitzades per una aplicació, apunten a una pàgina assignada o generen un page fault, PF (error de pàgina). Les pàgines que no han estat assignades no tenen una adreça des del punt de vista de l'aplicació, i per això no són visibles.
Un error de pàgina no té per què ser un error fatal del sistema. Aquest tipus d'errors no solament s'utilitzen per a protecció de memòria, sinó també d'una altra forma interessant: el sistema operatiu pot interceptar l'error de pàgina i pot carregar una pàgina que ha estat traslladat a un disc, i tornar a l'aplicació que va causar l'error de pàgina. D'aquesta forma l'aplicació obté la pàgina de memòria requerida. Aquest concepte, conegut com a swapping, permet desplaçar a un disc les dades de la memòria que no s'estan usant, i portar-los de tornada de forma transparent per a les aplicacions, augmentant així la capacitat de memòria.

### Claus de protecció

El concepte de clau de protecció, conegut en anglès com protection key, divideix la memòria física en blocs d'una grandària particular (ex. 2KB), de manera que cadascun d'ells té associat un nombre denominat clau de protecció. Cada procés està associat amb una clau de protecció. A l'hora d'accedir a la memòria el maquinari comprova que la clau de protecció del procés actual coincideix amb el del bloc de memòria al que s'accedeix, en cas contrari es produeix una excepció. Aquest mecanisme es va utilitzar en l'arquitectura del System/360.
Les claus de protecció del System/360 s'associen amb adreces físiques. No s'ha de confondre amb el concepte utilitzat per processadors com el Intel Itanium i l'HP Precision Architecture (l'HP/PA és també conegut com a PA-RISC), que són associats amb adreces virtuals, i que permeten múltiples claus per procés.
En les arquitectures de l'ordinador PA les traduccions (entrades TLB) tenen claus (Itanium) o "identificadors d'accés" (PA) associats. Un procés en execució té diversos registres de claus de protecció: 16 en el cas de l'Itanium, 4 en el cas del HP PA. Una traducció seleccionada per l'adreça virtual compara la seva clau amb la dels altres registres de clau de protecció. Si algun d'ells coincideix (a més de superar altres tipus de proves), l'accés és permès. Si cap coincideix, llavors es genera un error o una excepció. L'administrador d'errors de programari pot, en cas necessari, comparar la clau que falta amb una llarga llista de claus mantingudes pel programari. Per això, els registres de clau de protecció dins del processador poden considerar-se com una memòria cau (o cache en anglès) controlada per programari d'una llarga llista de claus associades amb un procés,
PA té una grandària de clau d'entre 15-18 bits; Itanium requereix almenys 18 bits. Les claus s'associen normalment amb "dominis de protecció", com biblioteques, mòduls, etc.

### Segmentació simulada

La simulació és l'ús d'un programa de vigilància interpretant les instruccions de codi màquina d'un ordinador. Un simulador d'un conjunt d'instruccions pot proveir protecció de memòria usant un concepte similar al de segmentació, i validant l'adreça de destinació i la longitud de cada instrucció en temps real abans d'executar-les. El simulador ha de calcular l'adreça de destinació i la longitud, i comparar-la amb una llista de rangs d'adreces vàlides de les quals disposa en un entorn de fils d'execució, com els blocs de memòria dinàmica adquirits des del començament del fil d'execució més buits de memòria estàtica compartida. El significat de "vàlid" pot canviar al llarg de la vida del fil depenent del context: en algunes ocasions pot ser permissible alterar un bloc estàtic de magatzematge, en altres ocasions no, depenent de la manera d'execució que pot variar segons la clau de magatzematge o l'estat de supervisió.
Generalment no es recomana utilitzar aquest mètode de protecció de memòria si es disposa de recursos ajustats en el CPU, atès que la pèrdua de recursos de l'ordinador per processar és considerable. No obstant això, s'usa normalment per facilitar la cerca d'errors, i per verificar el programari, proveint un nivell de granularitat extremadament fi per combatre la violació d'emmagatzematge, i pot indicar amb exactitud que instrucció tracta de sobreescriure una secció donada d'emmagatzematge, que podria tenir la mateixa clau d'emmagatzematge que emmagatzematge desprotegit. Antics sistemes d'IBM de teleprocessament com per exemple, CICS, les transaccions comercials multifils en emmagatzematge desprotegit i compartit durant aprox. 20 anys.

### Adreçament basat en la capacitat

L'adreçament basat en la capacitat és un interessant concepte per a la protecció de memòria, encara que ja no s'utilitzi en ordinadors moderns. Sota aquest concepte, els punters són reemplaçats per objectes protegits (denominats capacitats) que solament poden crear-se mitjançant l'ús d'instruccions privilegiades que només poden executar-se pel nucli (o algun altre procés amb l'autoritat per a això). Això possibilita al nucli controlar quins processos poden accedir a quins objectes en la memòria sense haver d'utilitzar espais d'adreces separats i sense la necessitat de canvis de context.

## Mesuraments

Una estimació útil sobre el nivell de protecció d'una implementació en particular és mesurar que mesura se cenyeix al principi de menor privilegi.

## Protecció de memòria en diferents sistemes operatius

Són escassos els sistemes operatius que no fan ús de la protecció de memòria. La majoria dels sistemes operatius dels PCs dels anys 1970 i 1980, CP/M, i totes les variants de MS-DOS no en disposaven atès que van ser dissenyats per a ordinadors que no oferien el maquinari necessari que la feien viable. Fins i tot llavors, versions de Microsoft Windows, començant amb Windows 2.1x van implementar protecció de memòria sobre el DOS en processadors Intel 80286 o superiors.
Alguns dels sistemes operatius que disposen de protecció de memòria inclouen:
* La família Microsoft Windows
* La majoria de sistemes tipus Unix incloent:
** Solaris
** Linux
** BSD
** Mac OS X (l'anterior Mac OS tenia una protecció de memòria limitada)
En sistemes Unix, s'utilitza la crida de sistema per controlar la protecció de memòria.

## Referències

* 1 2 Intel. «Intel 64 and IA-32 Architectures Software Developer's Manuals: Volume 3A: System Programming Guide, Part 1» (PDF), 01-07-2008. [Consulta: 21 agost 2008].
* ↑ Keys in Itanium
* ↑ Protecció de memòria en HP PA-RISC Arxivat 2011-06-07 a Wayback Machine. (anglès)
* ↑ Cook, D.J. Measuring memory protection, accepted for 3rd International Conference on Software Engineering, Atlanta, Georgia, maig del 1978.
* ↑ «Windows 9x does not have true memory protection». Everything2, 24-06-2000. [Consulta: 29 abril 2009].
* ↑ «mprotect». The Open Group Base Specifications Issue 6. The Open Group.

## Enllaços externs

* (anglès) Intel Developer Manuals - in-depth information on memory protection for Intel based architectures.