GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuál es el estado de registro predeterminado cuando se inicia el programa (asm, linux)?

Esto depende completamente del ABI de cada plataforma. Ya que mencionas eax y ebx veamos cuál es el caso para x86. En fs/binfmt_elf.c línea #972, dentro de load_elf_binary() , el núcleo comprueba si la ABI especifica algún requisito para los valores de registro en la carga del programa:

/*
 * The ABI may specify that certain registers be set up in special
 * ways (on i386 %edx is the address of a DT_FINI function, for
 * example.  In addition, it may also specify (eg, PowerPC64 ELF)
 * that the e_entry field is the address of the function descriptor
 * for the startup routine, rather than the address of the startup
 * routine itself.  This macro performs whatever initialization to
 * the regs structure is required as well as any relocations to the
 * function descriptor entries when executing dynamically links apps.
 */

Luego llama a ELF_PLAT_INIT , que es una macro definida para cada arquitectura en arch/xxx/include/elf.h . Para x86, hace lo siguiente:

#define ELF_PLAT_INIT(_r, load_addr)        \
    do {                                    \
        _r->bx = 0; _r->cx = 0; _r->dx = 0; \
        _r->si = 0; _r->di = 0; _r->bp = 0; \
        _r->ax = 0;                         \
    } while (0)

Entonces, cuando su binario ELF vinculado estáticamente se carga en Linux x86, puede contar con que todos los valores de registro sean iguales a cero. Sin embargo, no significa que debas hacerlo. :-)

Enlace dinámico

Tenga en cuenta que ejecutar un dinámicamente el binario vinculado en realidad ejecuta el código del vinculador dinámico en su proceso antes de que la ejecución llegue a su _start (Punto de entrada ELF). Esto puede y deja basura en los registros, según lo permitido por la ABI. Excepto, por supuesto, para el puntero de pila ESP/RSP y atexit gancho EDX/RDX.


Para sistemas AMD64 o x86-64 (64 bits) en Linux, la ABI x86-64 define el contenido inicial de los registros.

Hay especificaciones similares para i386 ABI, ARM ABI, etc.

Consulte las páginas de wikipedia sobre ELF y ABI


x86-64 Sistema V ABI

3.4.1 "Estado inicial de pila y registro" (Basile vinculado a la versión PDF de esto):

  1. %rsp apunta a la pila

    El puntero de la pila contiene la dirección del byte con la dirección más baja que forma parte de la pila. Se garantiza que estará alineado en 16 bytes en la entrada del proceso

  2. %rdx un puntero de función que la aplicación debe registrar con atexit si no es cero.

    un puntero de función con el que la aplicación debe registrarse

  3. %rbp no está especificado, pero el espacio de usuario debe establecerlo en el marco base.

    El contenido de este registro no se especifica en el momento de la inicialización del proceso, pero el código de usuario debe marcar el marco de pila más profundo al establecer el puntero del marco en cero.

  4. Todo lo demás indefinido.

Linux lo sigue "porque" lo dice el LSB.


Linux
  1. ¿Qué es un usuario de Linux?

  2. ¿Qué obtendría cuando sudo un programa destructivo del kernel?

  3. ¿Qué hace un programa cuando se envía una señal Sigkill?

  4. ¿Qué son los procesos, subprocesos, procesos ligeros y estado del proceso de Linux?

  5. ¿Qué sucede al enviar SIGKILL a un Proceso Zombie en Linux?

Linux:¿a qué nos referimos exactamente cuando decimos que estamos usando Linux?

Linux:¿qué hacer cuando un escritorio Linux se congela?

Linux:¿qué sucede cuando ejecuta Rsync sin una ruta de destino?

¿Qué sistema de archivos usar cuando se usa tanto Windows como Linux?

¿Cuál es el estado actual del soporte del controlador de video de Linux?

¿Cuál es la versión coloreada del programa superior de Linux?