En programación informática , un programa autorreubicable es un programa que reubica sus propias instrucciones y datos dependientes de la dirección cuando se ejecuta y, por lo tanto, es capaz de cargarse en la memoria en cualquier dirección. [1] [2] En muchos casos, el código autorreubicable también es una forma de código automodificable .
La autorreubicación es similar al proceso de reubicación empleado por el enlazador - cargador cuando un programa se copia desde un almacenamiento externo a la memoria principal; la diferencia es que es el programa cargado en sí mismo, en lugar del cargador en el sistema operativo o shell , el que realiza la reubicación.
Una forma de autorreubicación ocurre cuando un programa copia el código de sus instrucciones de una secuencia de ubicaciones a otra secuencia de ubicaciones dentro de la memoria principal de una sola computadora y luego transfiere el control del procesador de las instrucciones que se encuentran en las ubicaciones de origen de la memoria a las instrucciones que se encuentran en las ubicaciones de destino de la memoria. De esta manera, los datos que procesa el algoritmo del programa son la secuencia de bytes que define el programa.
La autorreubicación estática generalmente ocurre en el momento de la carga (después de que el sistema operativo ha cargado el software y le ha pasado el control, pero aún antes de que haya terminado su inicialización), a veces también cuando se cambia la configuración del programa en una etapa posterior durante el tiempo de ejecución . [3] [4]
Como ejemplo, la autorreubicación se emplea a menudo en las primeras etapas del arranque de sistemas operativos en arquitecturas como las compatibles con IBM PC , donde los cargadores de arranque en cadena de nivel inferior (como el registro de arranque maestro (MBR), el registro de arranque de volumen (VBR) y las etapas de arranque iniciales de sistemas operativos como DOS ) se mueven fuera de lugar para cargar la siguiente etapa en la memoria.
En CP/M , la herramienta de depuración dinámica (DDT) del depurador se reubica dinámicamente en la parte superior de la memoria disponible a través de la reubicación del límite de página para maximizar el área de programa transitorio (TPA) para que se ejecuten los programas. [5] [6]
En 1988, el procesador de línea de comandos alternativo ZCPR 3.4 para el Z-System introdujo los llamados programas tipo 4 , que también eran auto-reubicables a través de un stub incorporado. [7] [8] [9] [10] [11]
En DOS , la auto-reubicación a veces también es utilizada por controladores más avanzados y extensiones residentes del sistema (RSXs) o programas residentes de terminación y permanencia (TSRs) cargándose a sí mismos "en lo alto" en la memoria superior de manera más efectiva que lo posible para cargadores "altos" provistos externamente (como LOADHIGH / HILOAD , INSTALLHIGH / HIINSTALL o DEVICEHIGH / HIDEVICE etc. [12] desde DOS 5) para maximizar la memoria disponible para aplicaciones. Esto se debe al hecho de que el sistema operativo no tiene conocimiento del funcionamiento interno de un controlador que se va a cargar y, por lo tanto, tiene que cargarlo en un área de memoria libre lo suficientemente grande como para contener todo el controlador como un bloque que incluye su código de inicialización, incluso si este se liberara después de la inicialización. Para los TSR, el sistema operativo también tiene que asignar un Prefijo de Segmento de Programa (PSP) y un segmento de entorno . [13] Esto puede hacer que el controlador no se cargue en el área de memoria libre más adecuada o incluso evitar que se cargue en lo alto. En contraste con esto, un controlador auto-reubicable puede cargarse en cualquier lugar (incluso en la memoria convencional ) y luego reubicar solo su porción residente (normalmente mucho más pequeña) en un área de memoria libre adecuada en la memoria superior. Además, los TSR auto-reubicables avanzados (incluso si ya están cargados en la memoria superior por el sistema operativo) pueden reubicarse en la mayor parte de su propio segmento PSP y buffer de línea de comandos y liberar su segmento de entorno para reducir aún más la huella de memoria resultante y evitar la fragmentación . [14] Algunos TSR auto-reubicables también pueden cambiar dinámicamente su "naturaleza" y transformarse en controladores de dispositivos incluso si se cargaron originalmente como TSR, por lo que normalmente también liberan algo de memoria. [4] Finalmente, es técnicamente imposible para un cargador externo reubicar los controladores en la memoria expandida (EMS), el área de memoria alta (HMA) o la memoria extendida (a través de DPMS o CLOAKING ), porque estos métodos requieren que pequeños stubs específicos del controlador permanezcan en la memoria convencional o superior para coordinar el acceso al área de destino de la reubicación, [15] [nb 1] [nb 2] y en el caso de los controladores de dispositivos también porque el encabezado del controlador siempre debe permanecer en el primer megabyte. [15] [13]Para lograr esto, los conductores deben estar especialmente diseñados para apoyar la auto-reubicación en estas áreas. [15]
Algunos controladores DOS avanzados también contienen un controlador de dispositivo (que se cargaría en el desplazamiento +0000h por el sistema operativo) y TSR (cargado en el desplazamiento +0100h) que comparten una porción de código común internamente como binario fat . [13] Si el código compartido no está diseñado para ser independiente de la posición , requiere alguna forma de reparación de dirección interna similar a lo que de otro modo ya habría llevado a cabo un cargador de reubicación ; esto es similar a la etapa de reparación de la auto-reubicación pero con el código ya cargado en la ubicación de destino por el cargador del sistema operativo (en lugar de hacerlo el propio controlador).
IBM DOS/360 no tenía la capacidad de reubicar programas durante la carga. A veces se mantenían múltiples versiones de un programa, cada una construida para una dirección de carga diferente ( partición ). Una clase especial de programas, llamados programas auto-reubicables, fueron codificados para reubicarse a sí mismos después de la carga. [16] IBM OS/360 reubicaba los programas ejecutables cuando se cargaban en la memoria. Solo se requería una copia del programa, pero una vez cargado, el programa no podía ser movido (el llamado código independiente de la posición de un solo uso ).
Como ejemplo extremo de auto-reubicación (muchas veces), también llamada auto-reubicación dinámica, es posible construir un programa de computadora de modo que no permanezca en una dirección fija en la memoria, incluso mientras se ejecuta, como por ejemplo se usa en pruebas de memoria de gusanos . [17] [18] [19] [20] El gusano Apple también es un auto-reubicador dinámico. [21]
[…] Laws: […] "
reubicación dinámica
" del sistema operativo. ¿Puede decirnos qué es eso y por qué era importante? […]
Eubanks
: […] lo que hizo
Gary
[…] fue […] alucinante. […] Recuerdo el día en la
escuela
que entró de golpe al laboratorio y dijo: “He descubierto cómo
reubicar”
. Aprovechó el hecho de que el único byte siempre iba a ser el
byte de orden superior
. Y así creó un
mapa de bits
. […] No importaba cuánta memoria tuviera la computadora, el sistema operativo siempre se podía mover a la memoria superior. Por lo tanto, se podía comercializar esto […] en máquinas con diferentes cantidades de memoria. […] No se podía vender 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 se dio cuenta de esto una noche, probablemente en mitad de la noche pensando en algo de codificación, y esto realmente hizo que CP/M fuera posible comercializar. Realmente creo que sin esa reubicación habría sido un problema muy difícil. Hacer que la gente lo compre les parecería complicado, y si añadías más memoria tendrías que conseguir un sistema operativo diferente. […]
Intel
[…] tenía los
bytes invertidos
, ¿no?, para las direcciones de memoria. Pero siempre estaban en el mismo lugar, por lo que se podían reubicar en un
límite de 256 bytes
, para ser precisos. Por lo tanto, siempre se podía reubicar con solo un mapa de bits de dónde estaban esos […] Leyes: Sin duda, la explicación más elocuente que he tenido sobre la reubicación dinámica […][5][6] (33 páginas)
[…] Agregue un encabezado de controlador de dispositivo SYS al controlador, de modo que CTMOUSE pueda ser
a la vez un
TSR
normal
y un controlador de dispositivo, similar a nuestro controlador de teclado avanzado FreeKEYB. […] Esto no es realmente necesario en
DR DOS
porque
INSTALL
= es compatible desde DR DOS 3.41+ y DR DOS conserva el orden de las directivas
[D]CONFIG.SYS
[…] pero mejoraría […] la flexibilidad en los sistemas
MS-DOS
/
PC DOS
, que […] siempre ejecutan las directivas
DEVICE
= antes de cualquier instrucción INSTALL=, independientemente de su orden en el archivo. […] El software puede requerir que el controlador del mouse esté presente como un controlador de dispositivo, ya que los controladores de mouse siempre han sido controladores de dispositivo en los viejos tiempos. Estos controladores de mouse han tenido nombres de controlador de dispositivo específicos según el protocolo que usaron ("
PC$MOUSE
" para
el modo de sistemas de mouse
, por ejemplo), y algún software puede buscar estos controladores para averiguar el tipo correcto de mouse que se usará. […] Otra ventaja sería que los controladores de dispositivo generalmente consumen menos memoria (sin
entorno
, sin
PSP
) […] Básicamente, es un encabezado de archivo complicado, un código diferente para analizar la línea de comando, un punto de entrada y una línea de salida diferentes, y algo de magia de segmento para superar la diferencia ORG 0 / ORG 100h. La carga automática de un controlador de dispositivo es un poco más complicada, ya que debe dejar el encabezado del controlador donde está y solo reubicar el resto del controlador […]
[…] Al menos el
MS-DOS 6.0
+
GRAFTABL
se reubica sobre partes de su segmento
PSP
(desplazamiento +60h y hacia arriba) para minimizar su tamaño residente. […](NB. Una versión GRAFTABL 2.00+ posterior a DR-DOS 7.03 también admite la reubicación automática dinámica).
[…] DOSRELO proporciona un método para hacer que los programas de problemas
de DOS
se reubiquen automáticamente. DOSRELO logra la capacidad de reubicación automática para todos los programas, independientemente del lenguaje, agregando lógica de punto de entrada al
código objeto
del programa antes de que el
Editor de vínculos
lo catalogue en la
Biblioteca de imágenes del núcleo
. […]
[…] Además de buscar una instrucción, el
Z80
utiliza la mitad del ciclo para
refrescar
la
RAM dinámica
. […] dado que el Z80 debe dedicar la mitad de cada ciclo
de búsqueda de instrucciones
a realizar otras tareas, no tiene tanto tiempo para buscar un
byte de instrucción
como para buscar un byte de datos. Si uno de los
chips de RAM
en la ubicación de memoria a la que se accede es un poco lento, el Z80 puede obtener el patrón de bits incorrecto cuando busca una instrucción, pero obtener el correcto cuando lee datos. […] la prueba de memoria incorporada no detectará este tipo de problema […] es estrictamente una prueba de lectura/escritura de datos. Durante la prueba, todas las instrucciones se obtienen de la
ROM
, no de la RAM […] lo que da como resultado que el
H89
pase la prueba de memoria pero siga funcionando de forma errática en algunos programas. […] Este es un programa que prueba la memoria reubicándose a través de la RAM. Mientras lo hace, la CPU imprime la dirección actual del programa en el
CRT
y luego obtiene la instrucción en esa dirección. Si los IC de RAM están bien en esa dirección, la CPU reubica el programa de prueba en la siguiente ubicación de memoria, imprime la nueva dirección y repite el procedimiento. Pero, si uno de los IC de RAM es lo suficientemente lento como para devolver un patrón de bits incorrecto, la CPU malinterpretará la instrucción y se comportará de forma impredecible. Sin embargo, es probable que la pantalla se bloquee mostrando la dirección del IC defectuoso. Esto reduce el problema a ocho IC, lo que es una mejora con respecto a tener que verificar hasta 32. […] El […] programa realizará una
prueba de gusano
enviando una instrucción RST 7 (RESTART 7) desde el extremo inferior de la memoria hasta la última dirección de trabajo. El resto del programa permanece estacionario y se encarga de mostrar la ubicación actual del comando RST 7 y su
reubicación
. Por cierto, el programa se llama prueba de gusano porque, a medida que la instrucción RST 7 avanza por la memoria, deja un
rastro viscoso
de
NOP
(NO OPERATION). […]