La segmentación de memoria es una técnica de gestión de memoria del sistema operativo que divide la memoria principal de un ordenador 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 los archivos objeto de los programas compilados cuando se enlazan para formar una imagen de programa y cuando dicha imagen se carga en la memoria.
Los segmentos suelen corresponder a divisiones naturales de un programa, como rutinas individuales o tablas de datos [ 1 ], por lo que la segmentación suele ser más visible para el programador que la paginación por sí sola. [ 2 ] Los segmentos pueden crearse 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 utilizaban. Su objetivo era aumentar la fiabilidad de los sistemas que ejecutaban 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 un identificador de segmento y un desplazamiento dentro del segmento. [ 3 ] Una unidad de administración de memoria (MMU) de hardware es responsable de traducir el segmento y el desplazamiento a una dirección física , y de realizar comprobaciones para asegurarse de que la traducción se pueda realizar y que la referencia a ese segmento y desplazamiento esté permitida.
Cada segmento tiene una longitud y un conjunto de permisos (por ejemplo, lectura , escritura , ejecución ) asociados. [ 3 ] Un proceso solo puede hacer referencia a un segmento si el tipo de referencia está permitido por los permisos 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 fallo de segmentación .
Los segmentos también pueden utilizarse para implementar memoria virtual . En este caso, cada segmento tiene un indicador asociado que señala 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 de "segmento no presente" y el sistema operativo carga el segmento en la memoria desde el almacenamiento secundario.
La segmentación es un método para implementar la protección de memoria . [ 5 ] La paginación es otro, 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 diversas maneras en distintos tipos de hardware, con o sin paginación. La segmentación de memoria Intel x86 no se ajusta a ninguno de estos modelos y se analiza por separado más adelante, así como con mayor detalle en un artículo aparte.
Segmentación sin paginación
Cada segmento viene asociado a información que indica su ubicación en la memoria : la base del segmento . Cuando un programa accede a una ubicación de memoria, se suma el desplazamiento a la base del segmento para generar una dirección de memoria física.
La 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. Al cargar un segmento, el sistema operativo debe asignar suficiente memoria libre contigua para alojarlo por completo. A menudo, se produce fragmentación de memoria si no hay suficiente memoria contigua, aunque haya 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 . Cuando un programa hace referencia a una ubicación de memoria, el desplazamiento se traduce a una dirección de memoria mediante la tabla de páginas. Un segmento se puede extender asignando otra página de memoria y añadiéndola a su tabla de páginas.
Una implementación de memoria virtual en un sistema que utiliza segmentación con paginación generalmente solo mueve páginas individuales entre la memoria principal y el almacenamiento secundario, de forma similar a un sistema paginado sin segmentación. Las páginas del segmento pueden ubicarse en cualquier parte de la memoria principal y no es necesario que sean contiguas. Esto suele resultar en una menor cantidad de entrada/salida entre el almacenamiento primario y secundario y una menor fragmentación de la memoria.
Historia
El ordenador B5000 de Burroughs Corporation fue uno de los primeros en implementar la segmentación y, posiblemente, el primer ordenador comercial en ofrecer memoria virtual [ 7 ] basada en la segmentación. El B5000 está equipado con una tabla de información de segmentos denominada Tabla de Referencia de Programa (PRT), que se utiliza para indicar si el segmento correspondiente reside en la memoria principal, así como para mantener la dirección base y el tamaño del segmento [ 8 ] . El posterior ordenador B6500 también implementó la segmentación; una versión de su arquitectura todavía se utiliza hoy en día en los servidores Unisys ClearPath Libra.
El ordenador GE 645 , una modificación del GE-635 con soporte para segmentación y paginación añadido, fue diseñado en 1964 para dar soporte a 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 un descriptor de acceso para un objeto como origen o destino, y un desplazamiento dentro del objeto. El descriptor de acceso se encontraba en un registro de 32 bits y el desplazamiento se calculaba a partir de un desplazamiento base en el siguiente registro, 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. Este índice es un índice dentro de una tabla de descriptores de objeto, que proporciona el tipo de objeto, su longitud y la dirección física de los datos, la tabla de páginas del objeto o la tabla de páginas de nivel superior para una tabla de páginas de dos niveles, según el tipo de objeto. [ 10 ]
Los ordenadores Prime , Stratus , Apollo , IBM System/38 e IBM AS/400 (incluido IBM i ) utilizan segmentación de memoria.
Ejemplos
Burroughs introdujo la segmentación en el B5000 , seguida de los modelos compatibles B5500 y B5700.
El modelo B6500 posterior sustituyó la tabla de referencia de programas (PRT) por una pila Saguaro , cambió los formatos de las palabras de control, cambió los formatos de los descriptores y cambió el mecanismo para hacer referencia a una palabra de control o un descriptor.
B5000, B5500 y B5700
Las palabras en los B5000, B5500 y B5700 tienen una longitud de 48 bits. [ 11 ] Los descriptores tienen el bit más significativo activado en la palabra. Residen en la Tabla de Referencia de Programa (PRT) o en la pila, y contienen un bit de presencia que indica si los datos están presentes en la memoria. Existen descriptores de datos y de programa distintos. [ 11 ] : 4-2–4-4
B6500, B7500 y sus sucesores
Las palabras en el B6500 y sus sucesores tienen 48 bits de datos y 3 bits de etiqueta. [ 12 ] : 2 - 1 Los bits de etiqueta indican el tipo de datos contenidos en la palabra; hay varios tipos de descriptores, indicados por diferentes valores de bits de etiqueta. [ 12 ] : 6-5–6-10 Las palabras de control y los descriptores residen en la pila Saguaro. Los segmentos de la matriz pueden ser paginados.
La línea incluye los modelos B6500, B6700, B7700, B6800, B6900, B5900, las máquinas Burroughs y Unisys de la serie A, y los sistemas Clearpath MCP actuales (Libra). Si bien se han introducido algunas mejoras a lo largo de los años, especialmente avances de hardware, la arquitectura ha cambiado poco. El esquema de segmentación se ha mantenido igual; consulte Memoria segmentada .
Arquitecturas Multics
Arquitectura S/370
En los modelos IBM System/370 [ a ] con almacenamiento virtual [ 13 ] [ 14 ] (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 de invá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 se establece para optimizar el uso de la TLB.
Cada una de las implementaciones DAT de IBM incluye una caché de traducción, que IBM denominó Búfer de Traducción Anticipada (TLB). Si bien el documento Principios de Operación describe el TLB en términos generales, los detalles no forman parte de la arquitectura y varían según el modelo.
A partir de los complejos de procesadores 3031, 3032 y 3033 , IBM ofreció una función llamada Espacio de direcciones dual [ 14 ] : 5-13–5-17, Control de espacio de direcciones dual : 5-17–5-20, Mecanismos de autorización DAS : 5-21–5-24, Traducción de número de PC [ 15 ] (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 mover datos entre los espacios de direcciones sujetos a una clave de protección. DAS admite una tabla de traducción para convertir un número de espacio de direcciones (ASN) de 16 bits a 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 , proporcionan una segmentación de memoria rudimentaria y carecen de protección de 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 de segmento; la granularidad de la dirección de inicio 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 PC y SP de 16 bits; el procesador no realiza comprobaciones de límites). El desplazamiento + dirección que exceda 0xFFFFF se reinicia a 0x00000. Cada segmento de 64 KiB se superpone a los siguientes 4095 segmentos; cada dirección física puede denotarse mediante 4096 pares segmento-desplazamiento. Este esquema solo puede direccionar 1 MiB (1024 KiB) de memoria física (y E/S mapeada en memoria). (El hardware de memoria expandible opcional puede agregar memoria conmutada por bancos bajo control de software). Intel denominó retroactivamente al único modo de funcionamiento de estos modelos de CPU x86 " modo real ".
Los procesadores Intel 80286 y posteriores añaden el " modo protegido 286 ", que conserva el direccionamiento de 16 bits y añade segmentación (sin paginación) y protección de memoria por segmento. Para la retrocompatibilidad, todas las CPU x86 arrancan en "modo real", con los mismos segmentos fijos superpuestos de 64 KiB, sin protección de memoria, solo 1 MiB de espacio de direcciones físicas y algunas diferencias sutiles ( área de memoria alta , modo irreal ). Para utilizar su espacio de direcciones físicas completo de 24 bits (16 MiB) y las funciones avanzadas de la MMU , un procesador 80286 o posterior debe cambiarse a "modo protegido" mediante software, normalmente 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 el mismo código puede ejecutarse 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 incorporan el " modo protegido 386 ", que utiliza direccionamiento de 32 bits, conserva la segmentación y añade 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 memoria lineal . Cuando se habilita la paginación, las direcciones en memoria lineal se asignan a direcciones físicas mediante una tabla de páginas independiente. La mayoría de los sistemas operativos no utilizaban la capacidad de segmentación, 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 intercambio utilizando únicamente paginación. Algunos utilizan el registro CS para proporcionar protección del espacio ejecutable en procesadores que carecen del bit NX o utilizan los registros FS o GS para acceder al almacenamiento local de subprocesos. [ 16 ] [ 17 ]
La arquitectura x86-64 no admite la segmentación en " modo largo " (modo de 64 bits). [ 18 ] 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 propósitos especiales, como el almacenamiento local de subprocesos. [ 16 ] [ 17 ]
Véase también
Notas
- ↑ Modelos 115, 125, 135, 138, 145, 148, 155 II, 158, 165 II y 168
Referencias
- 1 2 Holt, Anatol W. (1961). "Organización de programas y mantenimiento de registros para la asignación dinámica de almacenamiento" . Communications of the ACM . 4 (10): 422– 431. doi : 10.1145/366786.366795 . S2CID 18973700 .
- 1 2 Englander, Irv (2003). La arquitectura del hardware informático y el software de sistemas (3.ª ed.). Wiley. ISBN 0-471-07325-3.
- 1 2 3 Glaser, Edward L.; Couleur, John F.; Oliver, GA (1965). Diseño de sistema de una computadora para aplicaciones de tiempo compartido . Conferencia conjunta de computación de otoño de 1965.
- ↑ "1.2 Gestión de memoria". Tecnología AMD64 Arquitectura AMD64 Manual del programador Volumen 2: Programación del sistema (PDF) . Vol. 2. Advanced Micro Devices. 2018. pág. 5.
- ↑ Arpaci-Dusseau, Remzi H.; Arpaci-Dusseau, Andrea C. (2014). "Segmentación" (PDF) . Sistemas operativos: tres piezas fáciles . Libros de Arpaci-Dusseau.
- ↑ Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, volumen 3 (3A, 3B y 3C): Guía de programación del sistema (PDF) . Intel Corporation. 2012. págs. 3–13 .
- ↑ Mayer, Alastair JW "La arquitectura del Burroughs B5000: ¿20 años después y aún adelantado a su tiempo?" . Consultado el 15 de marzo de 2012 .
- ↑ Hayes, John P. (1978). Arquitectura y organización de computadoras . McGraw-Hill. pág. 371. ISBN 0-07-027363-4.
- ↑ Introducción a la arquitectura IAPX 432 (PDF) . Intel Corporation. 1981. pág. 78.
- ↑ Manual de referencia de arquitectura de CPU BiiN (PDF) . BiiN. Julio de 1998.
- 1 2 Características operativas de los procesadores para el Burroughs B 5000 (PDF) ( Ed. A), Detroit: Burroughs, 1962, 5000-21005A
- 1 2 B6500 Manual de referencia de sistemas de procesamiento de información (PDF) . Burroughs. Septiembre de 1969.
- ↑ "Traducción dinámica de direcciones" (PDF) . Principios de funcionamiento del IBM System/370 (PDF) . Sistemas (Cuarta edición). IBM . Septiembre de 1974. págs. 57–68 . GA22-7000-4.
- 1 2 "Traducción dinámica de direcciones". Principios de funcionamiento del IBM System/370 (Undécima edición). IBM. Septiembre de 1987. págs. 3-20 – 3-38 . GA22-7000-10.
- ↑ "Espacios de direcciones" (PDF) . Principios de funcionamiento de la arquitectura extendida del IBM System/370 (PDF) (Segunda edición). IBM. Enero de 1987. págs. 3-13 – 3-14 . SA22-7085-1.
- 1 2 Matt Pietrek (mayo de 2006). "Todo lo que necesitas saber para empezar a programar sistemas Windows de 64 bits" . Microsoft . Consultado el 18 de abril de 2023 .
- 1 2 Drepper, Ulrich (22-08-2013). "Manejo de ELF para almacenamiento local de subprocesos" (PDF) .
- ↑ Tecnología AMD64 Arquitectura AMD64 Manual del programador Volumen 2: Programación del sistema (PDF) . Vol. 2. Advanced Micro Devices. 2018.
Enlaces externos
- Manual del desarrollador de software de la arquitectura Intel IA-32, volumen 3A: Guía de programación del sistema. http://www.intel.com/products/processor/manuals/index.htm .
- Sistemas operativos: Principios internos y de diseño, de William Stallings. Editorial: Prentice Hall. ISBN 0-13-147954-7ISBN 978-0-13-147954-8.
- Gestión de la memoria