Cargadores
La Programación de Sistemas se refiere a la creación de programas cuya finalidad es servir a otros programas. Entre los programas que se manejan en la Programación de Sistemas se encuentran, entre otros, los sistemas operativos, los compiladores, los ensambladores, los cargadores, los macroprocesadores, los manejadores de bases de datos.
Un cargador es un programa que coloca en la memoria, para su ejecución, el programa guardado en algún dispositivo de almacenamiento secundario.
Dependiendo de la manera en que se manejen los procesos de liga y de carga, podemos clasificar a los cargadores en:
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 (teclado, discos, etc.). Esto se hace así para que sea el usuario el que ponga los programas que le interese ejecutar.
Cargadores absolutos
Como ya se menciono el programa cargador pone en memoria las instrucciones guardadas en sistemas externos. Independientemente de que sea un cargador inicial o no, si dichas instrucciones se almacenan siempre en ele 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 de memoria, sino referencias relativas a una dirección especial llamada dirección de reubicación.
El cálculo de las direcciones reubicables lo realiza el propio cargador a medida que va guardando las instrucciones en el espacio de memoria que le indique el usuario o el propio sistema operativo de la máquina.
A los cargadores que permiten estas operaciones se les denominan cargadores con reubicación.
Cargadores ligadores
Conocidos también por su término inglés Link editor o simplemente Linker, es muy común también referirse a él por la castellanización del nombre inglés, <>. A la acción de montar se le llama asimismo vulgarmente <>.
Montar un programa consiste en añadir al programa objeto obtenido en 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.
En el proceso de carga reubicable (relocalizable), un mismo programa puede ejecutarse en diferentes posiciones de memoria. Para esto, el programa objeto debe utilizar referencias a relativas a una dirección especial llamada dirección de reubicación.
El cálculo de las direcciones reubicables es realizado por el cargador a medida que va ubicando las instrucciones en el espacio de memoria que le indique el sistema operativo.
Cuando se utilizan subrutinas en un programa, el código ejecutable de cada una de ellas debe encontrarse en memoria al tiempo de ejecución. Para esto, antes de cargar un programa, debe ligarse su código objeto con los códigos objeto (guardados en uno o más archivos) de cada una de las subrutinas invocadas por él, obteniendo así un programa ejecutable que contiene tanto el código del módulo invocador como el código de los módulos invocados.
En este punto, es posible guardar el resultado del proceso de liga en un archivo que podrá ser utilizado por un cargador, o el mismo programa ligador puede también realizar la tarea de carga. Esto último evita el tener que guardar el código ejecutable en un archivo, con lo que se ahorra espacio en disco. Este ahorro de espacio en disco se paga con el tiempo gastado al tener que ligar todos los módulos cada vez que se necesite ejecutar el programa.
Este enlace se llama estático porque se realiza antes de ejecutar el programa. Existe otro proceso llamado enlace dinámico, el cual consiste en enlazar en tiempo de ejecución los módulos que contienen a las subrutinas.