La reubicación es el proceso de asignar direcciones de carga para códigos y datos dependientes de la posición de un programa y ajustar el código y los datos para reflejar las direcciones asignadas. [1] [2] Antes del advenimiento de los sistemas multiproceso, y aún en muchos sistemas embebidos, las direcciones de los objetos eran absolutas comenzando en una ubicación conocida, a menudo cero. Dado que los sistemas de multiprocesamiento se enlazan y cambian dinámicamente entre programas, se hizo necesario poder reubicar objetos utilizando código independiente de la posición . Un enlazador generalmente realiza la reubicación junto con la resolución de símbolos , el proceso de búsqueda de archivos y bibliotecas para reemplazar referencias simbólicas o nombres de bibliotecas.con direcciones utilizables reales en la memoria antes de ejecutar un programa.
La reubicación la realiza normalmente el enlazador en el momento del enlace , pero también se puede realizar en el momento de la carga mediante un cargador de reubicación , o en el tiempo de ejecución mediante el propio programa en ejecución . Algunas arquitecturas evitan la reubicación por completo al diferir la asignación de direcciones al tiempo de ejecución; esto se conoce como aritmética de dirección cero . [ cual? ]
Segmentación
Los archivos de objeto se segmentan en varios tipos de segmentos de memoria . Los segmentos de ejemplo incluyen segmento de código (.text) , segmento de datos inicializados (.data) , segmento de datos no inicializados (.bss ) u otros. [ aclaración necesaria ]
Mesa de reubicación
La tabla de reubicación es una lista de punteros creada por el traductor (un compilador o ensamblador ) y almacenada en el objeto o archivo ejecutable. Cada entrada en la tabla, o "reparación", es un puntero a una dirección absoluta en el código de objeto que debe cambiarse cuando el cargador reubica el programa para que se refiera a la ubicación correcta. Las reparaciones están diseñadas para respaldar la reubicación del programa como una unidad completa. En algunos casos, cada reparación en la tabla es en sí misma relativa a una dirección base de cero, por lo que las propias reparaciones deben cambiarse a medida que el cargador se mueve a través de la tabla. [2]
En algunas arquitecturas, una reparación que cruza ciertos límites (como el límite de un segmento) o que no está alineada con el límite de una palabra es ilegal y el enlazador lo marca como un error. [3]
DOS y Windows de 16 bits
Los punteros lejanos ( punteros de 32 bits con segmento : desplazamiento, utilizados para direccionar el espacio de memoria de 640 KB de 20 bits disponible para programas de DOS ), que apuntan a código o datos dentro de un ejecutable de DOS ( EXE ), no tienen segmentos absolutos, porque el La dirección real del código / datos depende de dónde se cargue el programa en la memoria y esto no se sabe hasta que se carga el programa.
En cambio, los segmentos son valores relativos en el archivo EXE de DOS. Estos segmentos deben corregirse cuando el ejecutable se haya cargado en la memoria. El cargador EXE usa una tabla de reubicación para encontrar los segmentos que necesitan ser ajustados.
Windows de 32 bits
Con los sistemas operativos Windows de 32 bits, no es obligatorio proporcionar tablas de reubicación para los archivos EXE, ya que son la primera imagen que se carga en el espacio de direcciones virtuales y, por lo tanto, se cargarán en su dirección base preferida.
Tanto para los archivos DLL como para los EXE que optan por la aleatorización del diseño del espacio de direcciones (ASLR), una técnica de mitigación de vulnerabilidades introducida con Windows Vista, las tablas de reubicación vuelven a ser obligatorias debido a la posibilidad de que el binario se mueva dinámicamente antes de ejecutarse, aunque siguen siendo lo primero que se carga en el espacio de direcciones virtuales.
Windows de 64 bits
Cuando se ejecutan binarios nativos de 64 bits en Windows Vista y versiones posteriores, ASLR es obligatorio [ cita requerida ] y, por lo tanto, el compilador no puede omitir las secciones de reubicación.
Sistemas similares a Unix
El formato ejecutable de formato ejecutable y enlazable (ELF) y el formato de biblioteca compartida que utilizan la mayoría de los sistemas similares a Unix permiten definir varios tipos de reubicación. [4]
Procedimiento de reubicación
El enlazador lee la información del segmento y las tablas de reubicación en los archivos de objeto y realiza la reubicación mediante:
- fusionar todos los segmentos de tipo común en un solo segmento de ese tipo
- Asignar direcciones de tiempo de ejecución únicas a cada sección y cada símbolo, dando a todos los códigos (funciones) y datos (variables globales) direcciones de tiempo de ejecución únicas.
- refiriéndose a la tabla de reubicación para modificar [ ¿por qué? ] símbolos para que apunten a las direcciones de tiempo de ejecución correctas [ aclaración necesaria ] .
Ejemplo
El siguiente ejemplo utiliza la arquitectura MIX de Donald Knuth y el lenguaje ensamblador MIXAL. Los principios son los mismos para cualquier arquitectura, aunque los detalles cambiarán.
- (A) El programa SUBR se compila para producir un archivo objeto (B), que se muestra como código máquina y ensamblador. El compilador puede iniciar el código compilado en una ubicación arbitraria, a menudo la ubicación 1 como se muestra. La ubicación 13 contiene el código de máquina para la instrucción de salto a la instrucción ST en la ubicación 5.
- (C) Si SUBR se vincula más tarde con otro código, puede almacenarse en una ubicación diferente a 1. En este ejemplo, el vinculador lo coloca en la ubicación 120. La dirección en la instrucción de salto, que ahora está en la ubicación 133, debe reubicarse. para apuntar a la nueva ubicación del código para la instrucción ST , ahora 125. [1 61 que se muestra en la instrucción es la representación del código de máquina MIX de 125].
- (D) Cuando el programa se carga en la memoria para ejecutarlo, se puede cargar en una ubicación distinta a la asignada por el enlazador. Este ejemplo muestra SUBR ahora en la ubicación 300. La dirección en la instrucción de salto, ahora en 313, necesita ser reubicada nuevamente para que apunte a la ubicación actualizada de ST , 305. [4 49 es la representación de máquina MIX de 305].
Ver también
- Vinculador (informática)
- Biblioteca (informática)
- Archivo de objeto
- Preencuadernación
- Biblioteca estática
- Auto reubicación
- Código independiente de la posición (PIC)
- Rebasar
- Recolección de basura
Referencias
- ^ "Tipos de código de objeto". Manual de referencia del cargador de aplicaciones iRMX 86 (PDF) . Intel . págs. 1-2, 1-3. Archivado (PDF) desde el original el 11 de enero de 2020 . Consultado el 11 de enero de 2020 .
[…] El código absoluto , y un módulo de objeto absoluto, es código que ha sido procesado por LOC86 para ejecutarse solo en una ubicación específica en la memoria. El cargador carga un módulo de objeto absoluto solo en la ubicación específica que debe ocupar el módulo. El código independiente de la posición (comúnmente conocido como PIC) se diferencia del código absoluto en que el PIC se puede cargar en cualquier ubicación de la memoria. La ventaja de PIC sobre el código absoluto es que PIC no requiere que reserve un bloque específico de memoria. Cuando el cargador carga el PIC, obtiene los segmentos de memoria del iRMX 86 del grupo del trabajo de la tarea que realiza la llamada y carga el PIC en los segmentos. Una restricción con respecto al PIC es que, como en el modelo PL / M-86 COMPACT de segmentación […], puede tener solo un segmento de código y un segmento de datos, en lugar de permitir que las direcciones base de estos segmentos y, por lo tanto, los segmentos mismos , varían dinámicamente. Esto significa que los programas PIC tienen necesariamente menos de 64K bytes de longitud. El código PIC se puede generar mediante el control BIND de LINK86. El código localizable en tiempo de carga (comúnmente conocido como código LTL) es la tercera forma de código objeto. El código LTL es similar al PIC en que el código LTL se puede cargar en cualquier lugar de la memoria. Sin embargo, al cargar código LTL, Loader cambia la parte base de los punteros para que los punteros sean independientes del contenido inicial de los registros en el microprocesador. Debido a esta corrección (ajuste de direcciones base), el código LTL puede ser utilizado por tareas que tienen más de un segmento de código o más de un segmento de datos. Esto significa que los programas LTL pueden tener más de 64K bytes de longitud. FORTRAN 86 y Pascal 86 producen automáticamente código LTL, incluso para programas cortos. El código LTL se puede generar mediante el control BIND de LINK86. […]
- ^ a b Levine, John R. (2000) [octubre de 1999]. "Capítulo 1: Vinculación y carga y Capítulo 3: Archivos de objeto". Enlazadores y cargadores . La Serie Morgan Kaufmann en Ingeniería de Software y Programación (1 ed.). San Francisco, Estados Unidos: Morgan Kaufmann . pag. 5. ISBN 1-55860-496-0. OCLC 42413382 . Archivado desde el original el 5 de diciembre de 2012 . Consultado el 12 de enero de 2020 .Código: [1] [2] Errata: [3]
- ^ Borland (1 de septiembre de 1999) [2 de julio de 1998]. "Artículo de Borland # 15961: Hacer frente a los mensajes de 'Desbordamiento de reparación'" . community.borland.com . Base de datos de información técnica - Producto: Borland C ++ 3.1. TI961C.txt # 15961. Archivado desde el original el 7 de julio de 2008 . Consultado el 15 de enero de 2007 .
- ^ "Formato ejecutable y enlazable (ELF)" (PDF) . skyfree.org . Especificación de formatos portátiles de estándares de interfaz de herramientas (TIS), versión 1.1. Archivado (PDF) desde el original el 24 de diciembre de 2019 . Consultado el 1 de octubre de 2018 .
Otras lecturas
- Johnson, Glenn (1975-12-21) [1975-11-13], 11/34 Prueba de lógica básica de gestión de memoria , Digital Equipment Corporation (DEC), MAINDEC-11-DFKTA-AD , consultado el 19 de agosto de 2017
- Kildall, Gary Arlen (febrero de 1978). "Una técnica sencilla para la reubicación estática de código máquina absoluto" . Revista de Calistenia y Ortodoncia por Computadora del Dr. Dobb . Empresa de informática del pueblo . 3 (2): 10–13 (66–69). ISBN 0-8104-5490-4. # 22. Archivado desde el original el 9 de septiembre de 2017 . Consultado el 19 de agosto de 2017 . [4] [5] [6] (Este método de "cambio de tamaño", llamado reubicación de límites de página , podría aplicarse estáticamente a una imagen de disco CP / M-80 usando MOVCPM para maximizar el TPA para que los programas se ejecuten. También fue utilizado dinámicamente por el depurador CP / M Dynamic Debugging Tool (DDT) para reubicarse en una memoria superior. El mismo enfoque fue desarrollado independientemente por Bruce Van Natta de IMS Associates para producir código PL / M reubicable . Como reubicación de límites de párrafo , Otra variante de este método se utilizó más tarde mediante TSR de reubicación automática de HMA dinámicamente como KEYB , SHARE y NLSFUNC en DR DOS 6.0 y superior. Un método granular mucho más sofisticado y a nivel de bytes basado en un enfoque algo similar se concibió e implementó de forma independiente por Matthias R. Paul y Axel C. Frinke por su eliminación dinámica de código muerto para minimizar dinámicamente la huella de tiempo de ejecución de los controladores residentes y TSR (como FreeKEYB).)
- Huitt, Robert; Eubanks, Gordon ; Rolander, Thomas "Tom" Alan ; Leyes, David; Michel, Howard E .; Halla, Brian; Wharton, John Harrison ; Berg, Brian; Su, Weilian; Kildall, Scott ; Kampe, Bill (25 de abril de 2014). Leyes, David (ed.). "Legacy of Gary Kildall: The CP / M IEEE Milestone Dedication" (PDF) (transcripción de video). Pacific Grove, California, EE.UU .: Museo de Historia de la Computación . Número de referencia CHM: X7170.2014. Archivado (PDF) desde el original el 27 de diciembre de 2014 . Consultado el 19 de enero de 2020 .
[…] Leyes: […] "relocalización dinámica" del SO. ¿Puede decirnos qué es y por qué fue importante? […] Eubanks : […] lo que hizo Gary […] fue […] alucinante. […] Recuerdo el día en la escuela que él vino brincando al laboratorio y dijo, he descubierto cómo reubicarme. Aprovechó el hecho de que el único byte siempre sería el byte de orden superior . Y entonces creó un mapa de bits . […] No importaba cuánta memoria tuviera la computadora, el sistema operativo siempre se podía mover a la memoria alta. Por lo tanto, podría comercializar esto […] en máquinas de diferentes cantidades de memoria. […] No podría estar vendiendo un CP / M de 64K y un CP / M de 47K. Sería ridículo tener una compilación difícil en las direcciones. Así que Gary descubrió esto una noche, probablemente en medio de la noche pensando en algo de codificación, y esto realmente hizo posible comercializar CP / M. Realmente creo que sin esa reubicación habría sido un problema muy difícil. Para que la gente lo compre, les parecería complicado, y si agregabas más memoria, tendrías que comprar un sistema operativo diferente. […] Intel […] tenía los bytes invertidos , a la derecha, para las direcciones de memoria. Pero siempre estaban en el mismo lugar, por lo que podría reubicarlo en un límite de 256 bytes , para ser precisos. Por lo tanto, siempre puede reubicarlo con solo un mapa de bits de dónde se encuentran esas […] Leyes: Sin duda, la explicación más elocuente que he tenido sobre la reubicación dinámica […]
[7] [8] (33 páginas) - Lieber, Eckhard; von Massenbach, Thomas (1987). "CP / M 2 lernt dazu. Modulare Systemerweiterungen auch für das 'alte' CP / M". c't - magazin für computertechnik (parte 1) (en alemán). Heise Verlag . 1987 (1): 124-135;Lieber, Eckhard; von Massenbach, Thomas (1987). "CP / M 2 lernt dazu. Modulare Systemerweiterungen auch für das 'alte' CP / M". c't - magazin für computertechnik (parte 2) (en alemán). Heise Verlag . 1987 (2): 78–85;Huck, Alex (9 de octubre de 2016). "RSM für CP / M 2.2" . Homecomputer DDR (en alemán). Archivado desde el original el 25 de noviembre de 2016 . Consultado el 25 de noviembre de 2016 .
- Guzis, Charles "Chuck" P. (16 de marzo de 2015). "Re: Programación en lenguaje ensamblador CP / M" . Foro de la computadora de la vendimia . Género: CP / M y MP / M. Archivado desde el original el 1 de febrero de 2020 . Consultado el 1 de febrero de 2020 .
[…] ¿Alguna vez se preguntó cómo funciona MOVCPM
? Dado que el BDOS y el CCP tienen mucha memoria, por encima de la aplicación del usuario, las direcciones deben cambiarse cada vez que se cambia el tamaño de la memoria del sistema. Ahora, eso requiere reubicar direcciones en código 8080 , ya que el direccionamiento relativo no es parte del hardware. Sin implementar un ensamblador y cargador de reubicación en toda regla, ¿cómo se hace esto? En realidad, es bastante inteligente y MP / M incluso usa este esquema para construir sus archivos reubicables de página. Simplemente ensambla el programa fuente dos veces con el segundo origen de ensamblaje 100H (256 bytes) más alto que el primero. A continuación, se comparan las dos imágenes binarias, byte por byte, y se construye un mapa en el que los pares de bytes difieren en valor exactamente 100H. El resultado es una lista de ubicaciones donde es necesario ajustar el valor de reubicación si se va a mover la ubicación de un programa en la memoria. MP / M llama a este tipo de archivo PRL (página reubicable), pero no sé si CP / M 2.2 alguna vez acuñó un nombre para él. […] - Guzis, Charles "Chuck" P. (29 de julio de 2015). "Re: ¿Cómo funciona MOVCPM.COM?" . Foro de la computadora de la vendimia . Género: CP / M y MP / M. Archivado desde el original el 1 de febrero de 2020 . Consultado el 1 de febrero de 2020 .
[…] MOVCPM
utiliza un tipo temprano de formato PRL. Básicamente, CP / M se ensambla dos veces; la segunda vez es un desplazamiento de 100H bytes. Se comparan los dos binarios y se construye un mapa de bits . Un bit establecido implica que se debe ajustar el byte de orden superior de una dirección. Los bytes de dirección de orden inferior no se ven afectados; por lo tanto, "Archivo reubicable de página". Cada byte del mapa de bits corresponde a 8 bytes en los datos binarios. […] Entonces, todo lo que se va a mover en MOVCPM es parte de la imagen y su mapa de bits de reubicación. […] - Guzis, Charles "Chuck" P. (8 de noviembre de 2016). "Re: ¿Es seguro utilizar RST 28h en programas de ensamblaje CP / M?" . Foro de la computadora de la vendimia . Género: CP / M y MP / M. Archivado desde el original el 1 de febrero de 2020 . Consultado el 1 de febrero de 2020 .
[…] He hecho referencia a los archivos PRL y cómo comenzaron originalmente con MOVCPM
, pero se convirtieron en una parte integral de MP / M y CP / M 3.0 . Pero los archivos PRL usan un mapa de bits en el que cada bit corresponde a una ubicación de memoria; un bit indica que se debe agregar un desplazamiento de reubicación de página a la ubicación de memoria correspondiente. Si tiene muy pocas referencias de memoria absolutas (a diferencia de las relativas), es posible que desee emplear una lista de punteros (2 bytes por referencia) en lugar de un mapa de bits. Esto es poco probable en el código 8080 que no tiene saltos relativos, pero puede ser una consideración para el código Z80 . El truco para descubrir esto rápidamente es ensamblar su programa dos veces; el segundo tiempo compensado por 100H, luego compare los dos binarios. La ventaja de la reubicación en tiempo de ejecución es que no tiene que incurrir en una penalización por el código que intenta solucionar el problema de la reubicación, sin "trucos"; solo escribe código directo. […] - Roth, Richard L. (febrero de 1978) [1977]. "La reubicación no es solo programas en movimiento" . Revista de Calistenia y Ortodoncia por Computadora del Dr. Dobb . Ridgefield, CA, EE.UU .: People's Computer Company . 3 (2): 14–20 (70–76). ISBN 0-8104-5490-4. # 22. Archivado desde el original el 20 de abril de 2019 . Consultado el 19 de abril de 2019 .
- Calingaert, Peter (1979) [5 de noviembre de 1978]. "8.2.2 Reubicación del cargador". Escrito en la Universidad de Carolina del Norte en Chapel Hill . En Horowitz, Ellis (ed.). Ensambladores, compiladores y traducción de programas . Serie de ingeniería de programas informáticos (1ª edición, 1ª ed.). Potomac, Maryland, EE.UU.: Computer Science Press, Inc. pp. 237 -241. ISBN 0-914894-23-4. ISSN 0888-2088 . LCCN 78-21905 . Consultado el 20 de marzo de 2020 . (2 + xiv + 270 + 6 páginas)
- El formato de archivo Microsoft OBJ . Microsoft , Servicios de soporte técnico. Nota de aplicación SS0288. Archivado desde el original el 9 de septiembre de 2017 . Consultado el 21 de agosto de 2017 .
- Tanenbaum, Andrew Stuart ; Bos, Herbert (2015). Sistemas operativos modernos (4 ed.). Pearson Education Inc. ISBN 978-0-13359162-0.
- Elliott, John C. (5 de junio de 2012) [2 de enero de 2000]. "Formato de archivo PRL" . seasip.info . Archivado desde el original el 26 de enero de 2020 . Consultado el 26 de enero de 2020 .
[…] Un archivo PRL es un archivo binario reubicable, utilizado por MP / M y CP / M Plus para varios módulos distintos a los archivos .COM . El formato de archivo también se utiliza para archivos FID en Amstrad PCW . Hay varios formatos de archivo que utilizan versiones de PRL: SPR (Sistema PRL), RSP (Proceso del sistema residente). LINK-80 también puede producir archivos OVL (superposición), que tienen un encabezado PRL pero no se pueden reubicar. Los controladores GSX están en formato PRL; también lo son las extensiones del sistema residente (.RSX). […]
[9] - Elliott, John C. (5 de junio de 2012) [2 de enero de 2000]. "Formato REL de Microsoft" . seasip.info . Archivado desde el original el 26 de enero de 2020 . Consultado el 26 de enero de 2020 .
[…] El formato REL es generado por M80 de Microsoft y RMAC de Digital Research . […]
- feilipu (5 de septiembre de 2018) [2 de septiembre de 2018]. "Soporte para PRL, página ejecutable reubicable para MP / M" . z88dk . Archivado desde el original el 1 de febrero de 2020 . Consultado el 26 de enero de 2020 .
[...] Por el ensamblado Microsoft .rel Archivos que el enlazador tiene que generar un formato ejecutable .prl de MP / M . El formato .PRL es esencialmente un archivo .COM con información adicional para permitir que el programa y sus datos se reubiquen en cualquier página. ¿Qué aspecto tiene un archivo .PRL? Los primeros bytes son el tamaño del programa, seguidos por el origen del programa en 0x0100. Después del programa, se agrega una máscara bit por byte para permitir que el sistema MP / M sepa qué bytes en el programa deben cambiarse cuando se reubica el programa. ¿Cómo lo hace el enlazador sin desmontar toda la aplicación? De antemano, el programa está vinculado para dos orígenes diferentes 0x0100 y 0x0200, a partir de los objetos .REL. El truco del enlazador es simplemente reconocer qué bytes en las dos versiones del ejecutable difieren. Luego, estos bytes se registran en la máscara de bits almacenada después del ejecutable, y el programa .PRL final está diseñado para ejecutarse desde 0x0100 más su desplazamiento de página. Se hace el mismo truco para los archivos ejecutables .RSP y .SPR, excepto que ambos formatos renuncian al desplazamiento y se ejecutan desde 0x0000 más su desplazamiento de página. […]
- Brothers, Hardin (abril de 1983). "Comprensión del código reubicable" . 80 Micro . El siguiente paso. 1001001, Inc. (39): 38 , 40, 42, 45. ISSN 0744-7868 . Consultado el 6 de febrero de 2020 . [10] [11]
- Brothers, Hardin (abril de 1985). "Programas reubicables: vagabundos de la microcomputación" . 80 Micro . El siguiente paso. CW Communications / Peterborough, Inc. (63): 98 , 100, 102–103. ISSN 0744-7868 . Consultado el 6 de febrero de 2020 . [12] [13]
- Mitchell, Bridger (julio-agosto de 1988). Carlson, Art (ed.). "Z3PLUS y reubicación: información sobre ZCPR3PLUS y cómo escribir el código Z80 de reubicación automática" . The Computer Journal (TCJ): programación, soporte al usuario, aplicaciones . CP / M avanzado. Columbia Falls, Montana, EE.UU. (33): 9 -15. ISSN 0748-9331 . arca: / 13960 / t36121780 . Consultado el 9 de febrero de 2020 . [14] [15]
- Sage, Jay (septiembre-octubre de 1988). Carlson, Art (ed.). "ZCPR3 Corner - Más sobre código reubicable, archivos PRL, ZCPR34 y programas Type-4" . The Computer Journal (TCJ): programación, soporte al usuario, aplicaciones . CP / M avanzado. Columbia Falls, Montana, EE.UU. (34): 20 -25. ISSN 0748-9331 . arca: / 13960 / t0ks7pc39 . Consultado el 9 de febrero de 2020 . [16] [17]
- Ganssle, Jack (febrero de 1992). "Escritura de código reubicable: algunos códigos incrustados deben ejecutarse en más de una dirección" . Programación de sistemas embebidos . The Ganssle Group: perfeccionamiento del arte de construir sistemas integrados / TGG. Archivado desde el original el 18 de julio de 2019 . Consultado el 20 de febrero de 2020 .