GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist der Standardregistrierungsstatus beim Programmstart (asm, linux)?

Dies hängt ganz von der ABI für jede Plattform ab. Da Sie eax erwähnen und ebx Mal sehen, was für x86 der Fall ist. In fs/binfmt_elf.c Zeile #972, innerhalb von load_elf_binary() , prüft der Kernel, ob die ABI irgendwelche Anforderungen für Registerwerte beim Programmladen spezifiziert:

/*
 * 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.
 */

Es ruft dann ELF_PLAT_INIT auf , ein Makro, das für jede Architektur in arch/xxx/include/elf.h definiert ist . Für x86 macht es Folgendes:

#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)

Wenn also Ihre statisch verknüpfte ELF-Binärdatei unter Linux x86 geladen wird, können Sie sich darauf verlassen, dass alle Registerwerte gleich Null sind. Das heißt aber nicht, dass Sie das tun sollten. :-)

Dynamische Verknüpfung

Beachten Sie, dass dynamisch ausgeführt wird verknüpfte Binärdatei führt tatsächlich dynamischen Linker-Code in Ihrem Prozess aus, bevor die Ausführung Ihren _start erreicht (ELF-Einstiegspunkt). Dies kann und wird Müll in den Registern hinterlassen, wie von der ABI erlaubt. Außer natürlich für den Stapelzeiger ESP/RSP und atexit Hook EDX/RDX.


Für AMD64- oder x86-64-Systeme (64 Bit) unter Linux definiert die x86-64-ABI den anfänglichen Inhalt von Registern.

Ähnliche Spezifikationen gibt es für i386 ABI, ARM ABI etc.

Siehe Wikipedia-Seiten zu ELF und ABI


x86-64 System V ABI

3.4.1 "Initial Stack and Register State" (Basile verlinkt auf die PDF-Version davon):

  1. %rsp zeigt auf den Stack

    Der Stapelzeiger enthält die Adresse des Bytes mit der niedrigsten Adresse, das Teil des Stapels ist. Es ist garantiert, dass es beim Prozesseintritt 16-Byte-ausgerichtet ist

  2. %rdx ein Funktionszeiger, den die Anwendung bei atexit registrieren soll, wenn er nicht Null ist.

    ein Funktionszeiger, bei dem sich die Anwendung registrieren soll

  3. %rbp ist nicht spezifiziert, aber das Userland sollte es auf den Basis-Frame setzen.

    Der Inhalt dieses Registers ist zum Zeitpunkt der Prozessinitialisierung nicht spezifiziert, aber der Benutzercode sollte den tiefsten Stapelrahmen markieren, indem er den Rahmenzeiger auf Null setzt.

  4. Alles andere undefiniert.

Linux folgt ihm dann, "weil" das LSB es so sagt.


Linux
  1. Was verwende ich unter Linux, um ein Python-Programm ausführbar zu machen?

  2. Wie ist der aktuelle Stand der Linux-Grafiktreiberunterstützung?

  3. Umgehen von Standardberechtigungen beim Mounten von HFS+-Volumes unter Linux

  4. Was passiert beim Senden von SIGKILL an einen Zombie-Prozess unter Linux?

  5. Linux - Welche Verzeichnisse sollte ich beim Sichern eines Servers ausschließen?

Was ist ein Linux-Benutzer?

Linux – Was genau meinen wir, wenn wir sagen, dass wir Linux verwenden?

Was ist die kolorierte Version des Linux-Top-Programms?

Der sicherste Weg, Linux zu partitionieren?

Was tun, wenn ein Linux-Desktop einfriert?

Was ist die Standardreihenfolge der Linux-Sortierung?