1. Carga: Esta es la función principal. El cargador lee el archivo ejecutable del programa (por ejemplo, un archivo '.exe` en Windows, un archivo ELF en Linux) desde el almacenamiento secundario (como un disco duro o SSD) en la memoria principal (RAM).
2. Vinculación: Muchos programas consisten en múltiples módulos o bibliotecas. El cargador resuelve referencias entre estos módulos, asegurando que cada módulo pueda acceder correctamente a las funciones y datos definidos en otros. Esto podría implicar vincular dinámicamente bibliotecas compartidas en tiempo de ejecución. Este paso asegura que todos los códigos y datos necesarios estén en su lugar.
3. Reubicación: El cargador ajusta las direcciones dentro del código del programa para reflejar las ubicaciones de memoria reales donde se cargará el programa. Debido a que el sistema operativo puede cargar programas en diferentes direcciones de memoria cada vez que se ejecutan, el cargador debe hacer estos ajustes para garantizar que el programa se ejecute correctamente, independientemente de dónde se coloque en la memoria.
4. Asignación: El cargador asigna el espacio de memoria necesario para el código, los datos y la pila del programa. Esto implica solicitar memoria del administrador de memoria del sistema operativo y reservar la cantidad apropiada de espacio.
5. Inicialización: Antes de la ejecución, el cargador podría realizar algunas tareas de inicialización, como configurar los registros del programa para señalar las ubicaciones de memoria correctas, inicializar variables globales o manejar argumentos del programa.
6. Transferencia de control: Finalmente, el cargador transfiere el control al punto de entrada del programa, lo que permite que el programa comience su ejecución. Esta es a menudo la función 'principal` en los programas C o C ++.
En esencia, el cargador actúa como un puente entre el programa almacenado en el disco y el programa de ejecución en la memoria, manejando todos los pasos necesarios para que el programa sea ejecutable. Los diferentes sistemas y arquitecturas operativas pueden implementar cargadores de varias maneras, pero las funciones fundamentales siguen siendo consistentes.