Cargador (informática) - Loader (computing)

En los sistemas informáticos, un cargador es la parte de un sistema operativo que se encarga de cargar programas y bibliotecas . Es una de las etapas esenciales en el proceso de inicio de un programa, ya que coloca los programas en la memoria y los prepara para su ejecución. La carga de un programa implica leer el contenido del archivo ejecutable que contiene las instrucciones del programa en la memoria y luego realizar otras tareas preparatorias necesarias para preparar el ejecutable para su ejecución. Una vez que se completa la carga, el sistema operativo inicia el programa pasando el control al código del programa cargado.

Todos los sistemas operativos que admiten la carga de programas tienen cargadores, además de los sistemas informáticos altamente especializados que solo tienen un conjunto fijo de programas especializados. Los sistemas integrados normalmente no tienen cargadores y, en cambio, el código se ejecuta directamente desde la ROM o similar. Para cargar el sistema operativo en sí, como parte del arranque , se utiliza un cargador de arranque especializado . En muchos sistemas operativos, el cargador reside permanentemente en la memoria, aunque algunos sistemas operativos que admiten memoria virtual pueden permitir que el cargador se ubique en una región de memoria que se puede paginar .

En el caso de los sistemas operativos que admiten memoria virtual, es posible que el cargador no copie realmente el contenido de los archivos ejecutables en la memoria, sino que simplemente declare al subsistema de memoria virtual que existe un mapeo entre una región de memoria asignada para contener la ejecución. el código del programa y el contenido del archivo ejecutable asociado. (Ver archivo mapeado en memoria ). El subsistema de memoria virtual se hace consciente de que las páginas con esa región de memoria deben llenarse a pedido si la ejecución del programa llega a esas áreas de memoria sin llenar. Esto puede significar que partes del código de un programa no se copian realmente en la memoria hasta que se utilizan realmente, y es posible que el código no utilizado nunca se cargue en la memoria.

Responsabilidades

En Unix , el cargador es el controlador de la llamada al sistemaexecve() . Las tareas del cargador de Unix incluyen:

  1. validación (permisos, requisitos de memoria, etc.);
  2. copiar la imagen del programa desde el disco a la memoria principal ;
  3. copiar los argumentos de la línea de comandos en la pila ;
  4. inicializar registros (por ejemplo, el puntero de pila);
  5. saltando al punto de entrada del programa ( _start ).

En Microsoft Windows 7 y superior, el cargador es la LdrInitializeThunk función contenida en ntdll.dll , que hace lo siguiente:

  1. inicialización de estructuras en la propia DLL (es decir , secciones críticas , listas de módulos);
  2. validación de ejecutable a cargar;
  3. creación de un montón (a través de la función RtlCreateHeap );
  4. asignación de bloque de variable de entorno y bloque PATH;
  5. adición de ejecutables y NTDLL a la lista de módulos (una lista doblemente enlazada );
  6. carga de KERNEL32.DLL para obtener varias funciones importantes, por ejemplo BaseThreadInitThunk ;
  7. carga de las importaciones de ejecutables (es decir , bibliotecas de vínculos dinámicos ) de forma recursiva (verifique las importaciones de las importaciones, sus importaciones, etc.);
  8. en modo de depuración, aumento del punto de interrupción del sistema;
  9. inicialización de DLL;
  10. recolección de basura;
  11. llamar NtContinue al parámetro de contexto dado a la función de cargador (es decir, saltar a RtlUserThreadStart , que iniciará el ejecutable)

Reubicación de cargadores

Algunos sistemas operativos necesitan cargadores de reubicación , que ajustan las direcciones (punteros) en el ejecutable para compensar las variaciones en la dirección en la que comienza la carga. Los sistemas operativos que necesitan cargadores de reubicación son aquellos en los que un programa no siempre se carga en la misma ubicación en el espacio de direcciones y en los que los punteros son direcciones absolutas en lugar de desplazamientos de la dirección base del programa . Algunos ejemplos bien conocidos son OS / 360 de IBM para sus mainframes System / 360 y sus descendientes, incluido z / OS para mainframes z / Architecture .

OS / 360 y derivados

En OS / 360 y sistemas descendientes, la función del sistema operativo (privilegiado) se llama IEWFETCH y es un componente interno del Supervisor del SO, mientras que la aplicación LOADER (no privilegiada) puede realizar muchas de las mismas funciones, además de las del Linkage Editor, y es completamente externo al OS Supervisor (aunque ciertamente usa muchos servicios de Supervisor).

IEWFETCH utiliza programas de canal altamente especializados , y teóricamente es posible cargar y reubicar un ejecutable completo dentro de una revolución del medio DASD (aproximadamente 16.6 ms como máximo, 8.3 ms en promedio, en unidades "heredadas" de 3.600 rpm). Para los módulos de carga que exceden el tamaño de una pista, también es posible cargar y reubicar todo el módulo sin perder una revolución del medio.

IEWFETCH también incorpora funciones para las llamadas estructuras de superposición, lo que facilita la ejecución de ejecutables potencialmente muy grandes en un modelo de memoria mínima (tan pequeño como 44 KB en algunas versiones del sistema operativo, pero 88 KB y 128 KB son más comunes).

El núcleo del sistema operativo (la parte siempre residente del supervisor) en sí está formateado de una manera que es compatible con una versión simplificada de IEWFETCH. A diferencia de los ejecutables normales, el núcleo del sistema operativo está "cargado de dispersión": partes del núcleo se cargan en diferentes partes de la memoria; en particular, se requiere que ciertas tablas del sistema residan por debajo de los 64 KB iniciales, mientras que otras tablas y códigos pueden residir en otro lugar.

La aplicación Linkage Editor del sistema se llama IEWL. La función principal de IEWL es asociar módulos de carga (programas ejecutables) y módulos de objeto (la salida de, digamos, ensambladores y compiladores), incluidas "llamadas automáticas" a bibliotecas (lenguaje de alto nivel "funciones integradas"), en un formato. que puede ser cargado de manera más eficiente por IEWFETCH. Hay una gran cantidad de opciones de edición, pero para una aplicación convencional, solo algunas de ellas se emplean comúnmente.

El formato del módulo de carga incluye un "registro de texto" inicial, seguido inmediatamente por el "registro de reubicación y / o control" para ese registro de texto, seguido de más instancias de registros de texto y pares de registros de reubicación y / o control, hasta el final del módulo.

Los registros de texto suelen ser muy grandes; los registros de reubicación y / o control son pequeños ya que los tres búferes de registros de reubicación y / o control de IEWFETCH están fijos en 260 bytes (los registros de reubicación y / o control más pequeños son ciertamente posibles, pero 260 bytes es el máximo posible, y IEWL asegura que esta limitación se cumple, insertando registros de reubicación adicionales, según sea necesario, antes del siguiente registro de texto, si es necesario; en este caso especial, la secuencia de registros puede ser: ..., registro de texto, registro de reubicación, ..., registro de control , registro de texto, ...).

Un byte especial dentro de la memoria intermedia de registro de reubicación y / o control se usa como un área de comunicación de "giro de bits inhabilitado" y se inicializa con un valor único. La lectura CCW para ese registro de reubicación y / o control tiene establecido el bit de interrupción controlada por programa. De este modo, se notifica al procesador cuando el canal ha accedido a esa CCW a través de una salida especial de IOS . En este punto, el procesador entra en el ciclo de "giro de bits desactivado" (a veces llamado "el ciclo más corto del mundo"). Una vez que ese byte cambia de su valor inicializado, la CPU sale del giro de bits y se produce la reubicación, durante el "espacio" dentro del medio entre el registro de reubicación y / o control y el siguiente registro de texto. Si la reubicación finaliza antes del siguiente registro, el NOP CCW que sigue a la lectura se cambiará a un TIC, y la carga y reubicación continuará utilizando el siguiente búfer; de lo contrario, el canal se detendrá en NOP CCW, hasta que IEWFETCH lo reinicie a través de otra salida especial de IOS. Los tres búferes están en una cola circular continua, cada uno apunta al siguiente y el último al primero, y tres búferes se reutilizan constantemente a medida que avanza la carga y la reubicación.

IEWFETCH puede, por tanto, cargar y reubicar un módulo de carga de cualquier tamaño práctico y en el mínimo tiempo posible.

Enlazadores dinámicos

Dinámicas que vinculan cargadores son otro tipo de cargador que carga y enlace de bibliotecas compartidas (como archivos .so , .dll o archivos .dylib) a los programas en ejecución ya cargadas.

Ver también

Referencias