Bienvenidos a nuestro blog ¡Disfrútenlo!

lunes, 9 de julio de 2012


                                    CARGADORES

               En informática, un cargador es la parte de un sistema operativo que es responsable de cargar programas en memoria desde los ejecutables (por ejemplo, archivos ejecutables). El cargador es usualmente una parte del núcleo del sistema operativo y es cargado al iniciar el sistema y permanece en memoria hasta que el sistema es reiniciado o apagado. Algunos sistemas operativos que tienen un núcleo paginable pueden tener el cargador en una parte paginable de la memoria, entonces a veces el cargador intercambia de memoria (swapping).

               Todos los sistemas operativos que soportan la carga de programas tienen cargadores. Algunos sistemas operativos empotrados de computadoras altamente especializadas corren un único programa y no existen capacidades de carga de programas, por lo tanto no usan cargadores. Ejemplos de estos sistemas embebidos se encuentran en equipos de audio para automóviles. En los sistemas Unix, el cargador es el manejador para la llamada del sistema execve(). Algunas computadoras necesitan cargadores relocalizables, los cuales ajustan direcciones de memoria (punteros) en un ejecutable para compensar las variaciones en la cual la memoria disponible de la aplicación empieza.

              Las computadoras que necesitan de los cargadores relocalizables son aquellos en los cuales los punteros son direcciones absolutas en vez de compensaciones de direcciones base del programa. Un ejemplo muy conocido está en los mainframes IMB Sistema 360 y sus descendientes, incluyendo la serie de los sistemas Z9. Los ligadores dinámicos son otro tipo de cargador que carga y liga librerías dinámicas (como dll's). Muchos cargadores permiten al usuario especificar opciones que modificar el procesamiento estándar descrito. Muchos cargadores tienen un lenguaje especial de mandatos que se utiliza para especificar opciones.

       Algunas veces existe un archivo independiente de entrada al cargador que contiene esas proposiciones de control. En ocasiones esas mismas proposicio3nes también pueden estar intercaladas en el flujo primario de entrada entre los programas objeto. En ciertos sistemas el programador puede incluso introducir proposiciones de control del cargador en el programa fuente, y el ensamblador o el compilador retienen esos mandatos como parte del programa objeto.

           Una opción típica del cargador permite la selección de fuentes alternativas de entrada, por ejemplo el mandato INCLUDE, puede indicar al cargador que lea el programa objeto designado en una biblioteca y que lo trate como si fuera parte de la entrada primaria del cargador. Otros mandatos permiten al usuario eliminar símbolos externos o secciones de control completas.

                             CARGADOR LIGADOR

               Un cargador es un programa del sistema que realiza la acción de carga. Algunos sistemas tienen un ligador para realizar las operaciones de enlace, y un cargador separado para manejar la relocalización y la carga. 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 o una cinta magnética. El cargador consiste en un juego de instrucciones que permiten al dispositivo de entrada (teclado o unidad distinta) asignar la dirección de inicio de la memoria y asegurar que el computador leerá el programa y lo largará byte a byte. La ligadura de tales recursos puede ser de naturaleza estática o dinámica. Esto nos lleva al siguiente proceso: carga: lleva el programa objeto a la memoria para su ejecución relocalización: modifica el programa objeto de forma que puede cargarse en una dirección diferente de la localidad especificada originalmente ligado: combina 2 o más programas objeto independientes y proporciona la información necesaria para realizar referencias entre ellos. El ligador realiza la operación de enlazar programas objetos independientes. Los editores de ligado pueden efectuar varias funciones ultimas además de la simple preparación de un programa objeto para su ejecución estos también se pueden utilizar para construir paquetes de subrutinas u otras secciones de control que suelen utilizar juntas.

           Estos pueden ser útiles al tratar con bibliotecas de subrutinas que manejan lenguajes de programación de alto nivel. Comparados con los cargadores de ligadores los editores de ligado en general tienden a ofrecer mayor flexibilidad y control con el correspondiente incremento en complejidad y sobrecarga. La tarea primaria del enlazador es resolver referencias externas lleva acabo la siguiente etapa del proceso de traducción enlazado los módulos ensambladores y los acervos para formar un programa completo. En algunos sistemas el cargador simplemente copia el programa ejecutable a las posiciones de memorias apropiadas.
Sus Funciones:

- Enlazar código intermedio compilado independiente en un solo modulo de cara resolviendo las diferencias entre Tokens. Incorporada las denominadas rutinas de librería en caso de solicitarlas el propio programa.
- reunir procedimientos traducidos por separado y enlazarlos para que se ejecuten como una unidad llamada programa binario ejecutable.
Ahora si mostrar algunos tipos de cargadores.


              Arranque Bootstrap Cargadores iníciales:


Con la maquina vacía e inactiva, no hay necesidad recolección de programación, tan solo se puede especificar la dirección especifica del programa que se carga en primer lugar. En la mayoría de los casos este programa es el sistema operativo, que ocupa un lugar en la memoria. Esto significa para realizar las funciones. 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 hacer una buena solución del problema. Ofrece algunas ventajas sobre los otros tipos de ligado. Proporciona la posibilidad de cargare las rutinas solo cuando y si se necesitan. Si las subrutinas son grandes o tiene muchas referencias externas se pueden conseguir ahorros considerables de tiempo y espacio de memoria.

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 bootstrap, 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.


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 aconectar 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 ligadores (linker).

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 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.

          Montar un programa consiste en añadir al programa objeto obtenido a la traducción las rutinasexternas 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 está realizando el montaje de un programa a buscarlas y las adjunta al programa objeto


Características del cargador que dependen de la arquitectura de la computadora:

                   1. Relocalización:

       La primera característica que puede tener un cargador, que depende de la arquitectura de la computadora es el poder realizar las funciones de relocalización. Un cargador que posee esta capacidad se llama cargador relativo ("relativeloader"). Este cargador, a medida que va colocando las instrucciones del programa objeto en memoria, va actualizando las que sean necesarias para que contengan las direcciones correctas de los datos en memoria.

        Recordemos que en una computadora como la SIC, cada programa se ensambla con las direcciones de memoria que el programa ocupará, ya que esta máquina es para un solo usuario y éste puede saber o hasta escoger dónde su programa se cargará en memoria cuando se ejecute. Pero en una computadora como la SIC/XE, que posee multiprogramación (que significa memoria compartida por varios usuarios a la vez), los diferentes programadores no saben en qué lugar de memoria se cargará el programa, por lo que se codifica partiendo de la dirección 0 de memoria, y las direcciones se modificarían más tarde. Esa modificación la hace el cargador relativo.

         Recordemos también que no todas las instrucciones del programa ensamblado para la SIC/XE deben relocalizarse o modificarse. La mayoría de las instrucciones se ensamblan relativo al registro Base o al ProgramCounter, por lo que esas instrucciones no contienen direcciones, si no desplazamientos, los cuales no se relocalizan. Así que solo una pequeña fracción de las instrucciones de un programa deben relocalizarse.

  Estudiaremos dos métodos para realizar la relocalización:


El primer método consiste en usar récords adicionales en el programa objeto. Estos récords se llaman Récords de Modificación ("Modification Records"), y es el ensamblador quien los coloca en el programa objeto, ya que es el ensamblador el que puede determinar cuáles instrucciones del programa se deben relocalizar y cuáles no. El ensamblador coloca un Récord de Modificación por cada modificación que haya que hacer a una instrucción. El Récord de Modificación comienza con una M, luego tiene la dirección en memoria que hay que modificar, y luego tiene el valor que hay que sumar para hacer la modificación, o sea, el nombre del programa. El cargador relativo toma el programa, carga las instrucciones en los "Text Records" a memoria, y cuando encuentra los Récords de Modificación, sustituye ese nombre del programa por la dirección del programa en memoria para hacer las modificaciones cuando carga el programa.

Este método no es muy eficiente si hay muchas instrucciones a ser modificadas, pues se necesita un Récord de Modificación para cada modificación a realizarse.

El segundo método consiste en modificar el formato de los "Text Records" para que éstos contengan unos bits adicionales, llamados Bits de Relocalización. En cada "Text Record" hay un bit asociado por posición a cada instrucción en ese récord. Si el bit es 1, hay que modificar la instrucción asociada; si el bit es 0, no hay que modificar el récord.

Este método es más eficiente que el anterior pues economiza espacio, pero el método anterior es más versátil. Ahora veremos cómo.

 

        2. Resolución de referencias externas – enlace:

    La segunda característica que puede tener un cargador, que depende de la arquitectura de la computadora es el poder resolver las referencias externas en un programa objeto, esto es, poder enlazar un programa objeto a otro. Un cargador que posee esta capacidad se llama "linkingloader".

   El mecanismo para poder resolver las referencias externas requiere de comunicación entre el programador, el ensamblador y el programa de enlace ,El programador tiene a su disposición dos nuevas directrices al ensamblador. EXTDEF o "ExternalDefinition" es utilizada para avisar al ensamblador que las etiquetas en la directriz son definiciones externas, o sea, que son etiquetas definidas en ese programa pero pueden ser usadas por otros programas. EXTREF o "External Reference" es la directriz usada para avisar al ensamblador que las etiquetas en la directriz son referencias externas, es decir, que son definidas en otro programa pero ese programa las usa.

   Cuando el ensamblador encuentra la directriz EXTDEF coloca un nuevo récord en el programa objeto, llamado "Define record" con las etiquetas que pueden ser usadas por otros programas. Luego el ensamblador, a medida que va ensamblando las instrucciones, trata de resolver toda referencia a etiqueta hallada, y cuando no puede hacerlo pues es una etiqueta externa, añade un Récord de Modificación al programa objeto para modificar la instrucción con la referencia externa. De ahí la ventaja de los Récords de Modificación sobre los Bits de Relocalización: con éstos últimos no podemos resolver referencias externas.

   Cuando se van a cargar los diferentes programas (en este punto no se llaman programas, si no secciones de control), el "linkingloader" realiza dos pasadas sobre los programas objetos. En la primera pasada crea una tabla llamada ESTAB o "External Symbol Table" con las direcciones de todas las etiquetas que son referencias externas. En la segunda pasada es que se carga, relocaliza y enlaza el programa. ESTAB es una tabla "hash", similar a SYMTAB.


Características del cargador que no dependen de la arquitectura de la computadora.

                    1. Búsqueda automática en librerías

        A veces queremos usar una subrutina (por ejemplo, SquareRoot) que está definida en una librería o archivo donde se encuentran numerosas subrutinas prehechas. Al usar una subrutina de una librería, estamos haciendo una referencia externa en nuestro programa. El programa de enlace debe buscar automáticamente esa subrutina en la librería y enlazarla con nuestro programa. Debemos ser capaces de indicar al programa de enlace los nombres de las librerias en las que se deben buscar las referencias externas, si es que no están en otro programa objeto a enlazarse con el programa. En general, se buscan estas referencias en una librería general del sistema, pero podemos indicar al programa de enlace que busque en librerías específicas, como por ejemplo de Input/Output, matemática, gráfica, etc.

         2. Comandos al cargador/programa de enlace:

Muchos cargadores y/o programas de enlace permiten que se incluyan comandos a éste en el programa fuente. El traductor sabe que son comandos al "loader" y no los procesa, si no que los pasa al programa objeto. Ejemplos de estos comandos pueden ser:
- incluir una librería específica para que se busquen subrutinas ahí
- cambiar nombres a subrutinas
- que NO se resuelvan referencias externas (por ejemplo si no deseamos ejecutar el programa en ese momento, pues el resolver referencias externas hace que el programa ocupe más espacio en memoria

                Opciones en el diseño de un cargador:


Las opciones en el diseño del cargador responden a cómo se combinan las tres funciones básicas estudiadas en este capítulo, cargar, relocalizar y enlazar.
  • La primera opción es el "linkingloader" ya discutido, donde un solo programa hace todas las tareas.
  • La segunda opción es el uso de un "linkage editor" para enlazar solamente, creando un programa enlazado, es decir, con las referencias externas resuelta. A este programa se le llama "load module". Luego el cargador hace la relocalización mientras va cargando el programa. El "load module" o imagen ejecutable se guarda en disco hasta que se vaya a ejecutar. Esta alternativa es útil si el programa se va a ejecutar muchas veces sin modificarse, pues se guarda la imagen con las referencias externas resueltas, y cada vez que se vaya a ejecutar el programa solo se carga y se relocaliza, ahorrando tiempo

  • La tercera opción es posponer la resolución de referencias externas hasta que el programa está ejecutándose, usando una técnica llamada "dynamiclinking". Cuando se ejecuta una instrucción con una referencia externa, en ese momento el sistema operativo interrumpe brevemente al programa, carga la sección de control que contiene la referencia externa, y continúa la ejecución del programa. Esta alternativa es útil cuando el programa hace referencia a muchas rutinas que se ejecutarán con poca probabilidad (por ejemplo, rutinas de manejo de errores). De esta forma solo se carga a memoria loque seguramente se usará; las rutinas que se invocan solo en casos excepcionales se cargan si se invocan.

1 comentario: