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