Loader es el programa del sistema operativo que carga el ejecutable desde el disco a la memoria principal (RAM) para su ejecución . Asigna el espacio de memoria al módulo ejecutable en la memoria principal y luego transfiere el control a la instrucción inicial del programa.
Ejemplo:
akash @aix(/ u / akash) #cat./ ak1.cpp #include<stdio.h> int main() { printf("Testing of Loader !"); return 0; }
Compilando por el compilador xlC:
akash @aix(/ u / akash) #xlC – o ak1.out./ ak1.cpp akash @aix(/ u / akash) #ls – lrt ak1 * -rw – rw – r– 1 akash dev 74 Nov 12 06 : 10 ak1.cpp
– rwxrwxr – x 1 akash dev 8562 12 de noviembre 06 : 34 ak1.out akash @aix(/ u / akash) #
Lo que realmente sucede mientras se ejecuta el ejecutable: también se podría usar el comando strace para lo mismo.
akash@aix (/u/akash)# truss ./ak1.out eCCVE («./ ak1.out», 0x2ff20a00 ,
0x200138a8)
) = 0x00000000
sbrk(0x00000000) = 0x20000998
vmgetinfo(0x2FF20350, 7, 16) = 0
sbrk(0x00000000) = 0x20000998
sbrk(0x00000008) = 0x20000998
__libc_sbrk(0x00000000) = 0x200009A0
loadquery(2, 0x200009C8, 0x00001000) = 0
__loadx(0x0A040000 , 0xF06F599C, 0x00000000, 0xF05BE208, 0x20001D20) = 0xF05BFD64
loadbind(0, 0xF0760BBC, 0xF06D0E54) = 0
kfcntl(0, F_GETFL, 0x00000000) = 67110914
kfcntl(1, F_GETFL, 0x00000000) = 67110914
kfcntl(2, F_GETFL, 0x00000000) = 67110914
kfcntl(2, F_GETFL, 0x00000000) = 67110914
kioctl(1, 22528, 0x00000000, 0x00000000) = 0
Prueba del cargador !kwrite(1, ” Prueba de L”., 19) = 19
kfcntl(1, F_GETFL0, 0x000) = 67110914
kfcntl(2, F_GETFL, 0x2FF22FFC) = 67110914
_salir(0)
La primera llamada que se muestra es ‘ execve() ‘, que en realidad es el cargador. Este cargador crea el proceso que involucra:
- Leer el archivo y crear un espacio de direcciones para el proceso.
- Se crean las entradas de la tabla de páginas para las instrucciones, los datos y la pila de programas y se inicializa el conjunto de registros.
- Luego, ejecuta una instrucción de salto a la primera instrucción del programa que generalmente provoca una falla de página y la primera página de sus instrucciones se lleva a la memoria.
Los siguientes dos puntos no están relacionados con el cargador y son solo para obtener más información:
- Otra cosa que obtuvimos es la llamada a kwrite con el valor del argumento que se pasó a la función printf en nuestro programa. kwrite es una llamada al sistema que en realidad se llama desde la función printf con el valor que se le pasa y esta función es responsable de mostrar el valor en la consola con el valor que se le pasa.
- También recibimos la llamada _exit(0) en la última instrucción, que es la llamada al sistema _exit con el estado del argumento en 0, lo que significa volver al sistema operativo con una señal exitosa. Este _exit fue llamado desde la instrucción return(0).
Publicación traducida automáticamente
Artículo escrito por Akash yadav y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA