assembly - ¿Cómo funciona un cargador en el sistema operativo?
operating-system kernel (1)
Esto depende en gran medida del sistema operativo. Lo que voy a escribir aquí es específico de Linux, pero cosas similares ocurren en otros sistemas operativos.
Primero, se inicia la llamada fork()
, creando efectivamente un nuevo proceso (y entrada PCB apropiada). El siguiente paso es llamar a la llamada del sistema exec
que hará el trabajo duro. Asumiré que estamos hablando de ejecutables ELF aquí.
En ese caso, después de reconocer que este es el ejecutable ELF (al inspeccionar el número mágico), el load_elf_binary
llamará a load_elf_binary
( http://lxr.free-electrons.com/source/fs/binfmt_elf.c#L664 )
El argumento struct linux_binprm *bprm
que se pasa a esta función contiene todos los metadatos sobre binarios (ya rellenos por exec
) tales como nombre ejecutable, información de entorno, etc. ( http://lxr.free-electrons.com/source/include /linux/binfmts.h#L14 )
La carga del programa ELF es una tarea compleja y requiere la comprensión del formato ELF.
El muy buen recurso sobre esto se puede encontrar aquí
En pocas palabras, estos son pasos interesantes que el kernel está realizando:
comprueba los encabezados de duende para encontrar si hay un intérprete de programa especificado para este binario (
ld.so
se usa para vincular dinámicamente las bibliotecas requeridas, prepara las reubicaciones, llama a funciones de inicialización para las bibliotecas vinculadas).Configure el nuevo entorno ejecutable (configure las nuevas credenciales, marque el punto de no retorno, por ejemplo)
Configure el diseño de la memoria (como aleatorizar la pila) y asigne las páginas de ejecutable a memoria
Llamadas
start_thread
e inicia el programa o el intérprete (ld.so
)
Se puede encontrar un buen documento sobre la comprensión del duende con intérpretes aquí
Recursos:
- https://www.cs.stevens.edu/~jschauma/631/elf.html
- http://www.skyfree.org/linux/references/ELF_Format.pdf
- https://stackoverflow.com/a/31394861/133707
- http://s.eresi-project.org/inc/articles/elf-rtld.txt
Sé que un cargador es un programa que carga un programa a la memoria principal. Entonces, ¿cómo funciona esto realmente? ¿Qué pasa exactamente? En realidad, cuando un cargador carga un programa, se crea una entrada en PCB y el programa se coloca en un grupo de trabajo. ¿Cómo se copian los códigos ejecutables de un programa en la memoria principal? ¿En simple cómo cargar los códigos de un archivo a la memoria principal usando C o C ++?