stringtranslate.com

Segmentación de la memoria

La segmentación de la memoria es una técnica de gestión de la memoria del sistema operativo que consiste en dividir la memoria principal de una computadora en segmentos o secciones . En un sistema informático que utiliza segmentación, una referencia a una ubicación de memoria incluye un valor que identifica un segmento y un desplazamiento (ubicación de memoria) dentro de ese segmento. Los segmentos o secciones también se utilizan en archivos objeto de programas compilados cuando se vinculan entre sí en una imagen de programa y cuando la imagen se carga en la memoria.

Los segmentos generalmente corresponden a divisiones naturales de un programa, como rutinas individuales o tablas de datos [1] , por lo que la segmentación generalmente es más visible para el programador que la paginación sola. [2] Se pueden crear segmentos para módulos de programa o para clases de uso de memoria, como segmentos de código y segmentos de datos . [3] Ciertos segmentos pueden compartirse entre programas. [1] [2]

La segmentación se inventó originalmente como un método mediante el cual el software del sistema podía aislar los procesos de software ( tareas ) y los datos que están utilizando. Su objetivo era aumentar la confiabilidad de los sistemas que ejecutan múltiples procesos simultáneamente. [4]

Implementación de hardware

En un sistema que utiliza segmentación, las direcciones de memoria de la computadora constan de una identificación de segmento y un desplazamiento dentro del segmento. [3] Una unidad de gestión de memoria de hardware (MMU) es responsable de traducir el segmento y el desplazamiento a una dirección física , y de realizar comprobaciones para garantizar que se pueda realizar la traducción y que se permita la referencia a ese segmento y desplazamiento.

Cada segmento tiene una longitud y un conjunto de permisos (por ejemplo, lectura , escritura , ejecución ) asociados. [3] Un proceso solo puede hacer una referencia en un segmento si los permisos permiten el tipo de referencia y si el desplazamiento dentro del segmento está dentro del rango especificado por la longitud del segmento. De lo contrario, se genera una excepción de hardware , como un error de segmentación .

Los segmentos también se pueden utilizar para implementar memoria virtual . En este caso cada segmento tiene un indicador asociado que indica si está presente en la memoria principal o no. Si se accede a un segmento que no está presente en la memoria principal, se genera una excepción y el sistema operativo leerá el segmento en la memoria desde el almacenamiento secundario.

La segmentación es un método para implementar la protección de la memoria . [5] La paginación es otra y se pueden combinar. El tamaño de un segmento de memoria generalmente no es fijo y puede ser tan pequeño como un solo byte . [6]

La segmentación se ha implementado de varias maneras en distintos hardware, con o sin paginación. La segmentación de la memoria Intel x86 no se ajusta a ninguno de los modelos y se analiza por separado a continuación, y también con mayor detalle en un artículo separado.

Segmentación sin paginación

Asociada con cada segmento hay información que indica dónde se encuentra el segmento en la memoria: la base del segmento . Cuando un programa hace referencia a una ubicación de memoria, el desplazamiento se agrega a la base del segmento para generar una dirección de memoria física.

Una implementación de memoria virtual en un sistema que utiliza segmentación sin paginación requiere que segmentos completos se intercambien entre la memoria principal y el almacenamiento secundario. Cuando se intercambia un segmento, el sistema operativo tiene que asignar suficiente memoria libre contigua para contener todo el segmento. A menudo, la fragmentación de la memoria se produce si no hay suficiente memoria contigua, aunque pueda haber suficiente en total.

Segmentación con paginación

En lugar de una ubicación de memoria, la información del segmento incluye la dirección de una tabla de páginas para el segmento. Cuando un programa hace referencia a una ubicación de memoria, el desplazamiento se traduce a una dirección de memoria utilizando la tabla de páginas. Un segmento se puede ampliar asignando otra página de memoria y agregándola a la tabla de páginas del segmento.

Una implementación de memoria virtual en un sistema que utiliza segmentación con paginación generalmente solo mueve páginas individuales hacia adelante y hacia atrás entre la memoria principal y el almacenamiento secundario, similar a un sistema paginado no segmentado. Las páginas del segmento pueden ubicarse en cualquier lugar de la memoria principal y no necesitan ser contiguas. Esto generalmente da como resultado una cantidad reducida de entrada/salida entre el almacenamiento primario y secundario y una fragmentación de la memoria reducida.

Historia

La computadora Burroughs Corporation B5000 fue una de las primeras en implementar la segmentación y "quizás la primera computadora comercial en proporcionar memoria virtual" [7] basada en la segmentación. El B5000 está equipado con una tabla de información de segmentos llamada Tabla de referencia del programa (PRT) que se utiliza para indicar si el segmento correspondiente reside en la memoria principal, para mantener la dirección base y el tamaño del segmento. [8] La computadora B6500 posterior también implementó la segmentación; Una versión de su arquitectura todavía se utiliza hoy en los servidores Unisys ClearPath Libra.

La computadora GE 645 , una modificación de la GE-635 con soporte agregado de segmentación y paginación, fue diseñada en 1964 para admitir Multics .

El Intel iAPX 432 , [9] iniciado en 1975, intentó implementar una verdadera arquitectura segmentada con protección de memoria en un microprocesador.

La versión 960MX de los procesadores Intel i960 admitía instrucciones de carga y almacenamiento con el origen o el destino como un "descriptor de acceso" para un objeto y un desplazamiento en el objeto, con el descriptor de acceso en un registro de 32 bits y con el desplazamiento. calculado a partir de un desplazamiento base en el siguiente registro y de un desplazamiento adicional y, opcionalmente, un registro de índice especificado en la instrucción. Un descriptor de acceso contiene bits de permiso y un índice de objeto de 26 bits; El índice de objeto es un índice de una tabla de descriptores de objetos, que proporciona un tipo de objeto, una longitud de objeto y una dirección física para los datos del objeto, una tabla de páginas para el objeto o la tabla de páginas de nivel superior para un sistema de dos niveles. tabla de páginas para el objeto, dependiendo del tipo de objeto. [10]

Las computadoras Prime , Stratus , Apollo , IBM System/38 e IBM AS/400 (incluido IBM i ) utilizan segmentación de memoria.

Ejemplos

Arquitecturas de sistemas grandes de Burroughs

B5000

Los descriptores en B5000 , B5500 y B5700 residen en la tabla de referencia del programa (PRT) o en la pila y contienen un bit de presencia que indica si los datos están presentes en la memoria. Hay distintos datos y descriptores de programas.

B6500

Arquitecturas multics

Arquitectura S/370

En los modelos IBM System/370 [a] con almacenamiento virtual [11] [12] (DAT) y direcciones de 24 bits, el registro de control 0 especifica un tamaño de segmento de 64 KiB o 1 MiB y un tamaño de página de 2 KiB. o 4 KiB; El registro de control 1 contiene un designador de tabla de segmentos (STD), que especifica la longitud y la dirección real de la tabla de segmentos. Cada entrada de la tabla de segmentos contiene una ubicación de la tabla de páginas, una longitud de la tabla de páginas y un bit no válido. Posteriormente, IBM amplió el tamaño de la dirección a 31 bits y agregó dos bits a las entradas de la tabla de segmentos:

Bit de protección de segmento
El segmento es de solo lectura
Bit de segmento común
El segmento se comparte entre espacios de direcciones; este bit está configurado para optimizar el uso de TLB

Cada una de las implementaciones DAT de IBM incluye un caché de traducción, que IBM llamó Translation Lookaside Buffer (TLB). Si bien los Principios de operación analizan el TLB en términos generales, los detalles no son parte de la arquitectura y varían de un modelo a otro.

A partir de los complejos de procesadores 3031, 3032 y 3033 , IBM ofreció una función llamada Espacio de doble dirección [12] : 5-13–5-17, Control de espacio de doble dirección  : 5-17–5-20, Autorización DAS Mecanismos  : 5-21–5-24, Traducción de números de PC  [13] (DAS), que permite a un programa cambiar entre las tablas de traducción para dos espacios de direcciones, denominados espacio de direcciones primario (CR1) y espacio de direcciones secundario ( CR7), y para mover datos entre los espacios de direcciones sujetos a clave de protección. DAS admite una tabla de traducción para convertir un número de espacio de direcciones (ASN) de 16 bits en un STD, con instrucciones privilegiadas para cargar el STD en CR1 (primario) o CR7 (secundario).

arquitectura x86

Los primeros procesadores x86 , comenzando con el Intel 8086 , proporcionaban una segmentación de memoria cruda y ninguna protección de la memoria . (Cada byte de cada segmento está siempre disponible para cualquier programa). Los registros de segmento de 16 bits permiten 65.536 segmentos; cada segmento comienza en un desplazamiento fijo igual a 16 veces el número del segmento; la granularidad de la dirección inicial del segmento es de 16 bytes. Cada segmento otorga acceso de lectura y escritura a 64 KiB (65,536 bytes) de espacio de direcciones (este límite lo establecen los registros SP y PC de 16 bits; el procesador no realiza comprobaciones de límites). El desplazamiento+la dirección que excede 0xFFFFF se ajusta a 0x00000. Cada segmento de 64 KiB se superpone a los siguientes 4.095 segmentos; cada dirección física se puede indicar mediante 4.096 pares de segmento-desplazamiento. Este esquema puede abordar solo 1 MiB (1024 KiB) de memoria física (y E/S asignadas en memoria). ( El hardware de memoria expandida opcional puede agregar memoria conmutada por banco bajo control de software). Intel nombró retroactivamente al único modo operativo de estos modelos de CPU x86 " modo real ".

Los procesadores Intel 80286 y posteriores agregan el " modo protegido 286 ", que conserva el direccionamiento de 16 bits y agrega segmentación (sin paginación) y protección de memoria por segmento. Para compatibilidad con versiones anteriores, todas las CPU x86 se inician en "modo real", con los mismos segmentos superpuestos fijos de 64 KiB, sin protección de memoria, solo 1 MiB de espacio de dirección física y algunas diferencias sutiles ( área de memoria alta , modo irreal ). Para utilizar todo su espacio de direcciones físicas de 24 bits (16 MiB) y sus funciones avanzadas de MMU , un procesador 80286 o posterior debe cambiarse al "modo protegido" mediante software, generalmente el sistema operativo o un extensor de DOS . Si un programa no utiliza los registros de segmento, o solo coloca en ellos los valores que recibe del sistema operativo, entonces se puede ejecutar un código idéntico en modo real o en modo protegido, pero la mayoría del software en modo real calcula nuevos valores para los registros de segmento. rompiendo esta compatibilidad.

Los procesadores Intel i386 y posteriores agregan el " modo protegido 386 ", que utiliza direccionamiento de 32 bits, conserva la segmentación y agrega paginación de memoria . En estos procesadores, la tabla de segmentos, en lugar de apuntar a una tabla de páginas para el segmento, contiene la dirección del segmento en la memoria lineal . Cuando la paginación está habilitada, las direcciones en la memoria lineal se asignan a direcciones físicas utilizando una tabla de páginas separada. La mayoría de los sistemas operativos no utilizaron la capacidad de segmentación, a pesar de las posibles ventajas (espacio de direcciones lógicas de 4 x 4 GiB en lugar de solo 4 GiB), optando por mantener la dirección base en todos los registros de segmento igual a 0 en todo momento y proporcionar protección de memoria por página. e intercambiar usando solo paginación. Algunos usan el registro CS para proporcionar protección del espacio ejecutable en procesadores que carecen del bit NX o usan los registros FS o GS para acceder al almacenamiento local de subprocesos. [14] [15]

La arquitectura x86-64 no admite la segmentación en " modo largo " (modo de 64 bits). [16] Cuatro de los registros de segmento: CS, SS, DS y ES se fuerzan a 0 y el límite a 2 64 . Los registros de segmento FS y GS aún pueden tener una dirección base distinta de cero. Esto permite que los sistemas operativos utilicen estos segmentos para fines especiales, como el almacenamiento local de subprocesos. [14] [15]

Ver también

Notas

  1. ^ Modelos 115, 125, 135, 138, 145, 148, 155 II, 158, 165 II y 168

Referencias

  1. ^ ab Holt, Anatol W. (1961). "Organización de programas y mantenimiento de registros para la asignación de almacenamiento dinámico". Comunicaciones de la ACM . 4 (10): 422–431. doi : 10.1145/366786.366795 . S2CID  18973700.
  2. ^ ab Inglaterra, Irv (2003). La arquitectura del hardware y el software de sistemas (3ª ed.). Wiley. ISBN 0-471-07325-3.
  3. ^ a b C Glaser, Edward L.; Color, John F.; Oliver, GA (1965). Diseño de sistemas de una computadora para aplicaciones de tiempo compartido. Conferencia conjunta de informática de otoño de 1965.
  4. ^ "1.2 Gestión de la memoria". Tecnología AMD64 Manual del programador de arquitectura AMD64 Volumen 2: Programación del sistema (PDF) . vol. 2. Microdispositivos avanzados. 2018. pág. 5.
  5. ^ Arpaci-Dusseau, Remzi H.; Arpaci-Dusseau, Andrea C. (2014). «Segmentación» (PDF) . Sistemas operativos: tres piezas sencillas . Libros Arpaci-Dusseau.
  6. ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 3 (3A, 3B y 3C): Guía de programación del sistema (PDF) . Corporación Intel. 2012, págs. 3-13.
  7. ^ Mayer, Alastair JW "La arquitectura del Burroughs B5000: ¿20 años después y todavía adelantada a los tiempos?" . Consultado el 15 de marzo de 2012 .
  8. ^ Hayes, John P. (1978). Arquitectura y Organización de Computadores . McGraw-Hill. pag. 371.ISBN _ 0-07-027363-4.
  9. ^ Introducción a la arquitectura IAPX 432 (PDF) . Corporación Intel. 1981. pág. 78.
  10. ^ Manual de referencia de arquitectura de CPU BiiN (PDF) . BiiN. Julio de 1998.
  11. ^ "Traducción dinámica de direcciones" (PDF) . Principios de funcionamiento de IBM System/370 (PDF) . Sistemas (Cuarta ed.). IBM . Septiembre de 1974. págs. 57–68. GA22-7000-4.
  12. ^ ab "Traducción dinámica de direcciones". Principios de funcionamiento de IBM System/370 (undécima ed.). IBM. Septiembre de 1987. págs. 3-20–3-38. GA22-7000-10.
  13. ^ "Espacios de direcciones" (PDF) . Principios de funcionamiento de la arquitectura extendida de IBM System / 370 (PDF) (Segunda ed.). IBM. Enero de 1987. págs. 3-13–3-14. SA22-7085-1.
  14. ^ ab Matt Pietrek (mayo de 2006). "Todo lo que necesita saber para empezar a programar sistemas Windows de 64 bits". Microsoft . Consultado el 18 de abril de 2023 .
  15. ^ ab Drepper, Ulrich (22 de agosto de 2013). "Manejo de ELF para almacenamiento local de subprocesos" (PDF) .
  16. ^ Manual del programador de arquitectura AMD64 con tecnología AMD64, volumen 2: programación del sistema (PDF) . vol. 2. Microdispositivos avanzados. 2018.

enlaces externos