#include <stdio.h> int main(void) { return 0; }¿Cuándo y cómo se crea un bloque de control de procesos para el programa anterior?
Por ejemplo, antes de que el programa anterior entre en estado de ejecución, el kernel debe asignar un pcb para este proceso.
¿Dónde puedo encontrar las diversas llamadas al sistema de inicio realizadas en el kernel, para poder rastrear estas llamadas en el kernel?
Ejecuté un strace en el programa anterior pero no puedo obtenerlo.
execve("./a.out", ["./a.out"], [/* 42 vars */]) = 0 brk(0) = 0x9aaf000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78df000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=112037, ...}) = 0 mmap2(NULL, 112037, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb78c3000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220o\1\0004\0\0\0"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1462852, ...}) = 0 mmap2(NULL, 1473032, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x456000 mprotect(0x5b7000, 4096, PROT_NONE) = 0 mmap2(0x5b8000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x161) = 0x5b8000 mmap2(0x5bb000, 10760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x5bb000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c2000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb78c28d0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0x5b8000, 8192, PROT_READ) = 0 mprotect(0x8049000, 4096, PROT_READ) = 0 mprotect(0xa92000, 4096, PROT_READ) = 0 munmap(0xb78c3000, 112037) = 0 exit_group(0) = ?Necesito algunos consejos para mirar hacia adelante ....
La creación de procesos ocurre en el espacio del kernel y no en el espacio del usuario, por lo que no encontrará código para crear cosas específicas del proceso en ninguna de las bibliotecas del espacio del usuario. (Lo que puede encontrar en las bibliotecas de espacio de usuario es el cargador de archivos .so/enlazador de tiempo de ejecución, etc.)
La creación real de los procesos ocurre dentro de la llamada al sistema fork() o clone(). Esto hace que los procesos de llamada se dividan en dos, un padre y un hijo. El valor de retorno de la llamada del sistema le dirá al proceso de llamada cuál es. El uso más común es que el niño procesa después de fork(), realiza una llamada al sistema exec(). Esto hace que el programa de procesos se reemplace con un nuevo ejecutable utilizando los recursos de las personas que llaman (descriptores de archivo, entorno, usuario, grupo, directorio de trabajo actual, etc.)
Puede ver esta acción si rastrea un shell que ejecuta un script de shell.