La protección de memoria, del inglés memory protection, es un método para controlar el uso de memoria en una computadora, y es parte esencial de prácticamente todos los sistemas operativos modernos. El principal propósito de la protección de memoria es evitar que un proceso en un sistema operativo acceda a llamada ocultada para cualquier ocupación memoria que no le ha sido asignada. Así pueden evitarse problemas durante la ejecución del software, y también se evita que software maligno acceda a los recursos del sistema.
Métodos
Segmentación
La segmentación, en inglés: segmentation, hace referencia a la división de la memoria de una computadora en segmentos.
La arquitectura del x86 cuenta con diferentes opciones para la segmentación para quien desee protección de memoria en esta arquitectura.[1] En la arquitectura del x86, la Global Descriptor Table y la Local Descriptor Table se pueden usar para referenciar segmentos en la memoria de la computadora. Los punteros a los segmentos de memoria en los procesadores x86 también pueden almacenarse en los registros de segmentos del procesador. Inicialmente el x86 tenía 4 registros de segmentos: CS (code segment), SS (stack segment), DS (data segment) y ES (extra segment); para añadirse posteriormente dos registros más – FS and GS.[1]
Páginas
Este concepto, conocido en inglés como Paging, se basa en dividir el espacio de direcciones de memoria en pequeñas piezas idénticas llamadas páginas. Usando un mecanismo de memoria virtual se consigue que cada página resida en cualquier ubicación dentro de la memoria física, o pueda ser marcada como protegida. La memoria virtual posibilita tener un espacio de direcciones de memoria lineal y usarlo para acceder a bloques fragmentados a lo largo del espacio de direcciones de memoria física.
La mayoría de las arquitecturas de las computadoras basados en páginas, entre ellos la arquitectura del x86, hacen uso de la protección de memoria.
Se usa una tabla de páginas para asociar la memoria virtual con la memoria física. La tabla de páginas resulta transparente durante el proceso. Las tablas de memoria facilitan la asignación de memoria nueva, dado que cada página puede ser asignada desde cualquier memoria física.
Esta solución impide que una aplicación acceda a una página que no le ha sido explícitamente asignada, pues todas las direcciones de memoria, incluso las aleatorias, que son usadas por una aplicación, apuntan a una página asignada o generan un page fault, PF (error de página). Las páginas que no han sido asignadas no tienen una dirección desde el punto de vista de la aplicación, y por ello no son visibles.
Un error de página no tiene por qué ser un error fatal del sistema. Este tipo de errores no solo se utilizan para protección de memoria, sino también de otra forma interesante: el sistema operativo puede interceptar el error de página y puede cargar una página que ha sido trasladado a un disco, y volver a la aplicación que causó el error de página. De esta forma la aplicación obtiene la página de memoria requerida. Este concepto, conocido como swapping, permite desplazar a un disco los datos de la memoria que no se están usando, y traerlos de vuelta de forma transparente para las aplicaciones, aumentando así la capacidad de memoria.
Llaves de protección
El concepto de llave de protección, conocido en inglés como protection key, divide la memoria física en bloques de un tamaño particular y variable (ej. 2KB), de forma que cada uno de ellos tiene asociado un número denominado llave de protección. Cada proceso está asociado con una llave de protección. A la hora de acceder a la memoria el hardware comprueba que la llave de protección del proceso actual coincide con el del bloque de memoria al que se accede, en caso contrario se produce una excepción. Este mecanismo se usó en la arquitectura del System/360.
Las llaves de protección del System/360 se asocian con direcciones físicas. No ha de confundirse con el concepto usado por procesadores tales como el Intel Itanium y el HP Precision Architecture (el HP/PA es también conocido como PA-RISC), que son asociados con direcciones virtuales, y que permiten múltiples llaves por proceso.
En las arquitecturas de la computadora PA las traducciones (entradas TLB) tienen llaves (Itanium) o "identificadores de acceso" (PA) asociados. Un proceso en ejecución tiene varios registros de llaves de protección: 16 en el caso del Itanium,[2] 4 en el caso del HP PA.[3] Una traducción seleccionada por la dirección virtual compara su llave con la de los otros registros de llave de protección. Si alguno de ellos coincide (además de superar otros tipos de pruebas), el acceso es permitido. Si ninguno coincide, entonces se genera un error o una excepción. El administrador de errores de software puede, en caso necesario, comparar la llave que falta con una larga lista de llaves mantenidas por el software. Por ello, los registros de llave de protección dentro del procesador pueden contemplarse como una caché controlada por software de una larga lista de llaves asociadas con un proceso,
PA tiene un tamaño de llave de entre 15-18 bits; Itanium requiere al menos 18 bits. Las llaves se asocian normalmente con "dominios de protección", tales como bibliotecas, módulos, etc.
Segmentación simulada
La simulación es el uso de un programa de vigilancia interpretar las instrucciones de código máquina de una computadora. Un simulador de un conjunto de instrucciones puede proveer protección de memoria usando un concepto similar al de segmentación, y validando la dirección destino y la longitud de cada instrucción en tiempo real antes de ejecutarlas. El simulador debe calcular la dirección destino y la longitud y compararla con una lista de rangos de direcciones válidas de las que dispone en un entorno de hilos de ejecución, tales como los bloques de memoria dinámica adquiridos desde la inception del hilo de ejecución más huecos de memoria estática compartida. El significado de "válido" puede cambiar a lo largo de la vida del thread dependiendo del contexto: en algunas ocasiones puede ser permisible alterar un bloque estático de almacenaje, en otras ocasiones no, dependiendo del modo de ejecución que puede variar según la llave de almacenaje o el estado de supervisión.
Generalmente no se recomienda utilizar este método de protección de memoria si se dispone de recursos ajustados en el CPU, dado que la pérdida de recursos de la computadora para procesar es considerable. Sin embargo, se usa normalmente para facilitar la búsqueda de errores, y para verificar el software, proveyendo un nivel de granularidad extremadamente fino para combatir la violación de almacenamiento, y puede indicar con exactitud que instrucción trata de sobrescribir una sección dada de almacenamiento, que podría tener la misma llave de almacenamiento que almacenamiento desprotegido. Antiguos sistemas de IBM de teleprocesamiento como por ejemplo, CICS, multi-threaded transacciones comerciales en almacenamiento desprotegido y compartido durante aprox. 20 años.
Direccionamiento basado en la capacidad
El direccionamiento basado en la capacidad es un interesante concepto para la protección de memoria, aunque ya no se use en las computadoras modernos. Bajo este concepto, los punteros son reemplazados por objetos protegidos (denominados capacidades) que solo pueden crearse mediante el uso de instrucciones privilegiadas que solo pueden ejecutarse por el núcleo (o algún otro proceso con la autoridad para ello). Esto posibilita al núcleo controlar qué procesos pueden acceder qué objetos en la memoria sin tener que usar espacios de direcciones separados y sin la necesidad de cambios de contexto.
Mediciones
Una estimación útil sobre el nivel de protección de una implementación en particular es medir en que medida se ciñe al principio de menor privilegio.[4]
Protección de memoria en diferentes sistemas operativos
Son escasos los sistemas operativos que no hacen uso de la protección de memoria. La mayoría de los sistemas operativos de los PCs de los años 1970 y 1980, CP/M, y todas las variantes de MS-DOS no disponían de ella dado que fueron diseñados para ordenadores que no ofrecían el hardware necesario que la hacían viable. Incluso entonces, versiones de Microsoft Windows, comenzando con Windows 2.1x implementaron protección de memoria sobre el DOS en procesadores Intel 80286 o superiores.
Algunos de los sistemas operativos que disponen de protección de memoria incluyen:
- La familia Microsoft Windows
- La mayoría de sistemas tipo Unix incluyendo:
Véase también
Referencias
- ↑ a b Intel (2008-07). Intel 64 and IA-32 Architectures Software Developer's Manuals: Volume 3A: System Programming Guide, Part 1 (PDF). Intel. Consultado el 21 de agosto de 2008.
- ↑ Keys in Itanium Archivado el 28 de noviembre de 2007 en Wayback Machine.
- ↑ «Memory protection in HP PA-RISC». Archivado desde el original el 7 de junio de 2011. Consultado el 17 de marzo de 2009.
- ↑ Cook, D.J. Measuring memory protection, accepted for 3rd International Conference on Software Engineering, Atlanta, Georgia, mayo 1978.
Enlaces externos
- Esta obra contiene una traducción derivada de «memory protection» de Wikipedia en inglés, publicada por sus editores bajo la Licencia de documentación libre de GNU y la Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.
- Intel Developer Manuals - in-depth information on memory protection for Intel based architectures.