Cargadores y Ligadores - Blog de Tecnologia, Ingenieria en Sistemas

Novedades

martes, 25 de enero de 2011

Cargadores y Ligadores

Qué es un cargador y ligador?

 
Un ligador es un programa de sistema que combina dos o mas programas objeto separados y permite que se hagan referencias unos a otros, o sea, que cada uno de estos programas pueden hacer referencia a código ó variables de los otros programas con los que está enlazado.

En muchos programas el cargador hace la labor del programa de enlace, por que existe solo un "linking loader" y no existe programa de enlace independiente. Es importante señalar que no se necesita un programa de enlace ni un cargador separado para cada traductor en el sistema, ya que estos programas trabajan con el programa objeto, sin importar el lenguaje fuente. Por otro lado es importante que cada compilador o ensamblador produzca el programa objeto usando el mismo formato. Cada programa objeto es un archivo de récord.

Un cargador es un programa que coloca en la memoria para su ejecución, el programa guardado en algún dispositivo de almacenamiento secundario. Un cargador es un programa del sistema que realiza la función de carga, pero muchos cargadores también incluyen relocalización y ligado. Algunos sistemas tienen un ligador para realizar las operaciones de enlaces y un cargador separado para manejar la relocalización y la carga.

Los procesos de ensamblado y carga están íntimamente relacionados.

El cargador consiste en un juego de instrucciones que permiten al dispositivo de entrada ( teclado ó unidad de cinta ) asignar la dirección de inicio de la memoria y asegurar que el computador leerá el programa y lo cargara byte a byte.

Funciones De Un Cargador Y Un Ligador


Las funciones mas importantes de un cargador son: colocar un programa objeto en la memoria e iniciar su ejecución. Si tenemos un cargador que no necesita realizar las funciones de ligado y relocalización de programas, su operación es simple pues todas las funciones se realizan en un solo paso. Se revisa el registro de encabezamiento para comprobar se ha presentado el programa correcto para la carga (entrando en la memoria disponible). A medida que lee cada registro de texto, el código objeto que contiene pasa a dirección de la memoria indicada. Cuando se encuentra el registro de fin, el cargador salta a la dirección especificada para iniciar la ejecución del programa cargado. Un programa objeto contiene instrucciones traducidas y valores de datos del programa fuente y específica direcciones en memoria dónde cargaran estos elementos.
Carga que lleva el programa objeto a la memoria para su ejecución.

  • Relocalización que modifica el programa objeto de forma que puede cargarse en una dirección diferente de la localidad especificada originalmente.
  • Ligado que combina dos o mas programas objeto independientes y proporciona la información necesaria para realizar diferencias entre ellos.
  • El cargador es un programa del sistema que realiza la función de carga pero muchos cargadores también incluyen relocalización y ligado. Algunos sistemas tienen un ligador (ó editor de ligado ) para realizar las operaciones de enlace, y un cargador separado para manera la relocalización y la carga.
  • En la mayoría de los casos todos los traductores de programas ( esto es, ensambladores y compiladores ) de un sistema en particular producen programas objeto en el mismo formato.

De esta misma forma, puede usarse el cargador o ligador del sistema con independencia del lenguaje de programación fuente original, se suele utilizar el término cargador en lugar de cargador y ligador, los procesos de ensamblado y carga están íntimamente relacionados entre sí.

Se han desarrollado herramientas especiales de software, llamadas cargadores para asistir, al programados en la carga del programa. El cargador es normalmente un programa pequeño que permite al usuario entrar directamente las palabras de instrucción y datos a direcciones concretas de la memoria mediante, ó un teclado ó una cinta magnética.


Tipos de cargadores y Ligadores


Cargadores Bootstrap: el programa cargador una vez, situado en la memoria del computador, cargará el programa de aplicación y los datos. Pero, previamente, se ha debido cargar el cargador en la memoria. Y esto se puede realizar por los siguientes métodos:

  • Entrada manual: mediante el teclado el usuario teclea el cargador BOOTSTRAP. Después de esto, el cargador se carga así mismo en la memoria del computador.
  • Entrada por ROM: es posible tener las instrucciones de inicialización almacenados permanentemente en alguna porción de la ROM, en lugar de introducirlas manualmente por teclado o por panel frontal. Cuando se requiere el programa de bootstra, el operador simplemente dirige al computador, mediante los conmutadores del panel, a ejecutar las instrucciones memorizadas en ROM: al estar el programa almacenado en ROM se elimina también la posibilidad de borrados accidentales.

Cargadores iniciales: indican a la computadora la forma de poner, dentro de la memoria principal unos datos que están guardados en un periférico de memoria externa ( cinta, disco, etc ). Sirven para cargar en la memoria pequeños programas que inician el funcionamiento de una computadora .
Algunas computadoras de carácter general no tienen en memoria ningún programa de forma permanente y cuando se desconectan pierden toda la información de su memoria interna. Al volverlos a conectar no son capaces de controlar ningún periférico. Se hace así para que sea el usuario el que ponga los programas que le interese ejecutar.

Cargadores absolutos: el programa cargador pone en memoria las instrucciones guardadas en sistemas externos. Independientemente de que sea un cargador inicial, o no sin dichas instrucciones se almacenan siempre en el mismo espacio de memoria ( cada vez que se ejecuta el programa cargador ) se dice que es un cargador absoluto.

Cargadores con reubicación: en ocasiones un mismo programa necesita ejecutarse en diferentes posiciones de memoria. Para esto la traducción debe estar realizada en forma adecuada, es decir no utilizando referencias absolutas a direcciones en memoria, sino referencias a una dirección especial llamada de reubicación.

Cargadores ligadores: conocidos también como linker . un linker se un término en inglés que significa montar.
Montar un programa consiste en añadir al programa objeto obtenido a la traducción las rutinas externas a las que hace referencia dicho programa. El ensamblador debe permitir dichas referencias y las rutinas deben estar a su vez en lenguaje máquina guardadas en algún elemento accesible por el montador. Generalmente, dichas rutinas se encuentran guardadas en un fichero especial al que suele denominarse librería porque están almacenadas todas las rutinas externas susceptibles de ser utilizadas por los diferentes programas del usuario. Allí va el programa ligador cuando esta realizando el montaje de un programa a buscarlas y las adjunta al programa objeto. 

Editores de ligado: la diferencia fundamental entre un editor de ligado y un cargador ligador es:
Primero.- se ensambla o compila el programa fuente, produciendo un programa objeto ( que puede contener varias secciones de control diferentes ). Una cargador ligador realiza todas las operaciones de ligado y relocalización incluyendo búsqueda automática en bibliotecas, si se específica, y carga el programa ligado directamente en la memoria para su ejecución. Por otro lado un editor de ligado produce una versión ligada del programa ( llamada a menudo modulo de carga ó imagen ejecutable ) que se escribe en un archivo o biblioteca para su ejecución posterior.

Cuando el usuario está listo para ejecutar el programa ligado, se puede utilizar un cargador relocalizador simple para cargar el programa en la memoria. La única modificación necesaria al código objeto es la suma de una dirección de carga real a los valores relativos del programa. El editor de ligado realiza la relocalización de todas las secciones de control al inicio del programa ligado. De esta forma todos los elementos que necesitan modificarse en el momento de la carga tienen valores relativos al inicio del programa ligado.
Los editores de ligado se pueden utilizar para construir paquetes de subrutinas u otras secciones de control que se suelen utilizar juntas . esto puede ser útil al tratar con bibliotecas de subrutinas que manejan lenguajes de programación de alto nivel. A veces permiten al usuario especificar que las referencias externas no se resuelven por búsqueda automática en biblioteca.

Ligado dinámico: ofrece algunas ventajas sobre los tipos de ligado. Proporciona la posibilidad de cargar las rutinas sólo cuando si se necesitan. Si las subrutinas son grandes ó tienen muchas referencias externas se pueden conseguir ahorros considerables de tiempo y espacio en memoria.
El ligado dinámico evita la necesidad de cargar la biblioteca completa para cada ejecución. Puede incluso hacer innecesario que el programa conozca el conjunto de subrutinas que se podría utilizar. El nombre de la subrutina se trataría simplemente como otro elemento de entrada. En el método que se utilice aquí las rutinas que se carguen dinámicamente deben llamarse por medio de una solicitud del servicio al sistema operativo. Este método también podría considerarse como una solicitud a una parte del cargador que se mantiene en la memoria durante la ejecución del programa.
Cuando se utiliza ligado dinámico, la asociación de dirección real y el nombre simbólico de la rutina llamada no se hace hasta que se ejecuta la proposición llamada.

Proceso De Carga Absoluta

Para ser ejecutados los programas se deben ubicar e la memoria principal. Una tarea muy importante es asociar instrucciones y datos con localidades específicas de memoria. El trabajo de realizar está asociación se deja algunas veces al usuario, otras al traductor, otras al programa llamado cargador y otras más al sistema operativo. La asociación de instrucciones con ciertas localidades de memoria se conoce como ligamiento. Dentro de la programación el lenguaje máquina, el ligamiento y los sistemas de memoria virtual actuales lo realizan de manera dinámica mientras se ejecuta el programa. El retraso del ligamiento aumenta la flexibilidad para el usuario y el sistema, pero los traductores, ligadores y los sistemas operativos resultan más complejos. Un cargador es un programa que coloca las instrucciones de un programa y sus datos en memoria principal. Un cargador absoluto coloca las instrucciones y los datos en las localidades precisas indicadas por el programa en lenguaje de máquina. 

El proceso de carga absoluta consiste en que con la máquina vacía ó inactiva no hay necesidad de hacer relocalización de programas tan solo se puede especificar la dirección absoluta del programa que se cargue en primer lugar. En la mayoría de los casos este programa es el sistema operativo que ocupa un lugar predefinido en la memoria. Esto significa que se necesitan algunos medios para realizar las funciones de el cargador absoluto. Una opción es que el operador introduzca en la memoria el código objeto de un cargador absoluto, utilizando los interruptores en la consola del computador. Algunos computadores requerían que el operador hiciera exactamente eso. Sin embargo este proceso es demasiado incomodo y propenso a errores para ser una buena solución del problema.

proceso de carga

Otra posibilidad es que el programa del cargador absoluto resida permanente en una memoria sólo de lectura ( ROM). Cuando se produce una señal de hardware la máquina empieza a ejecutar este programa de la ROM. En algunos computadores el programa se ejecuta directamente en la ROM; en otros el programa se copia de la ROM a la memoria principal y se ejecuta allí. Sin embargo algunas máquinas no tienen ese almacenamiento sólo de lectura, además puede no ser conveniente cambiar un programa en ROM si es necesario hacer modificaciones en el cargador absoluto. Una solución inmediata es tener una función de hardware incorporada que lea un registro de longitud fija de algún dispositivo en alguna localidad fija de la memoria; el dispositivo que se utilice puede seleccionarse mediante interruptores de la consola. Una vez completa la operación de lectura, el control se pasa automáticamente a la dirección de la memoria dónde se almaceno el registro. Este registro contiene instrucciones de máquina que cargan el programa absoluto que sigue. Si el proceso de carga requieren de mas instrucciones de las que pueden leerse en un solo registro, el primer registro causa la lectura de otros y estos a su vez pueden originar la lectura aún de más registros de ahí el término arranque. 

La carga absoluta necesita que el modulo de carga ocupe siempre la misma posición de la memoria principal. Así pues , todas las referencias del módulo de carga para el cargador deben ser direcciones específicas ó absolutas en memoria principal. Por ejemplo si x en la siguiente figura es la posición de 1024 la primera palabra del módulo de carga destinado a esa región de memoria tendrá la dirección 1024. 

La asignación de direcciones especificas a la referencia a memoria de un programa pueden ser realizada tanto por el programador como el tiempo de compilación o ensamblaje. Con el primer método se tienen varias desventajas. En primer lugar todos los programadores tendrán que conocer la estrategia de asignación deseada para situar los módulos en memoria principal. En segundo lugar si hace alguna modificación en el programa que suponga inserciones ó borrados en el cuerpo del módulo tendrán que cambiarse todas las direcciones. Por consiguiente es preferible permitir que las referencias a memoria dentro de los programas se expresen simbólicamente y que se resuelvan en el momento de la compilación o el ensamblaje. Así cuando se presente el módulo para la entrada a un cargador absoluto, el ensamblador o el compilador convertirán todas estas referencias direcciones específicas. 

Proceso De Carga Relocalizable

En la relocalización se establece la correspondencia entre las direcciones usadas en el programa y direcciones físicas cada vez que se utilizan durante la ejecución del programa. Las direcciones lógicas generadas por el ensamblador y el enlazador no se alteran durante la carga. Comenzaremos por ver un sencillo método en el cuál el programa se carga en posiciones contiguas de la memoria; es decir el programa no está disperso por la memoria. En la siguiente figura se presenta un cargador sencillo que puede usarse con la relocalización dinámica. En este caso el cargador lee encabezado del archivo ejecutable y determina la cantidad de espacio necesaria para el programa. Después asigna espacio suficiente para el programa y copia el archivo ejecutable a memoria. Cuando se carga el programa en la memoria, el cargador establece la correspondencia necesaria para el programa, pasando la dirección de carga y el tamaño v del programa a una rutina llamada establecer-correspondencia. 


Ligaduras De Subrutinas

 
Al estudiar subrutinas es conveniente identificar dos funciones distintas : el invocador y el invocado.
  • El invocador : es la sección de código que inicia la llamada a la subrutina.
  • El invocado: es la subrutina llamada por el invocador.
Examinaremos las transferencias de control necesarias para implantar la invocación de subrutinas. Al efectuar una llamada se transfiere el control al cuerpo de la subrutina; cuando esta concluye, devuelve el control a la instrucción que está inmediatamente después de la llamada a la subrutina desde diversos puntos en el programa, las subrutinas deben ser capaces de regresar a distintos lugares del programa. La dirección de retorno es la dirección de la instrucción que esta inmediatamente después de la instrucción que transfiere el control al invocado. El invocador proporciona la dirección del retorno al invocado como parte de enlace de la subrutina.

El enlace de subrutina es la estructura con que se comparte información sobre el invocador y el invocado. El invocador establece parte del enlace de subrutina en una secuencia de instrucciones llamada secuencia de arranque. El invocado establece lo que resta del enlace de subrutina en el prologo de subrutina, el cuál puede estar vacío como suponemos de todas las rutinas están bien estructuradas, las instrucciones al final de la subrutina regresan al invocador. Está secuencia de instrucciones se denomina epílogo de subrutina . cuando el control regresa al invocador, es posible que este tenga que limpiar el enlace; este conjunto de instrucciones se denomina secuencia de limpieza y también puede estar vacía.



No hay comentarios:

Publicar un comentario

Gracias por su comentario