GNU/Linux >> Znalost Linux >  >> Linux

Jaký je výchozí stav registru při spuštění programu (asm, linux)?

To zcela závisí na ABI pro každou platformu. Protože jste zmínil eax a ebx podívejme se, jak je to s x86. V fs/binfmt_elf.c řádek #972, uvnitř load_elf_binary() , jádro zkontroluje, zda ABI specifikuje nějaké požadavky na hodnoty registrů při načítání programu:

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

Poté zavolá ELF_PLAT_INIT , což je makro definované pro každou architekturu v arch/xxx/include/elf.h . Pro x86 to dělá následující:

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

Když je tedy váš staticky propojený binární soubor ELF načten na Linuxu x86, můžete počítat s tím, že všechny hodnoty registrů budou rovné nule. Neznamená to však, že byste měli. :-)

Dynamické propojení

Všimněte si, že provádění dynamicky linked binary ve skutečnosti spustí kód dynamického linkeru ve vašem procesu, než spuštění dosáhne vašeho _start (vstupní bod ELF). To může a také zanechá v registrech odpadky, jak to povoluje ABI. Samozřejmě kromě ukazatele zásobníku ESP/RSP a atexit háček EDX/RDX.


Pro systémy AMD64 nebo x86-64 (64 bitů) na Linuxu určuje počáteční obsah registrů x86-64 ABI.

Existují podobné specifikace pro i386 ABI, ARM ABI atd.

Podívejte se na stránky wikipedie o ELF a ABI


x86-64 System V ABI

3.4.1 „Počáteční stav zásobníku a registrace“ (Basile je propojen s verzí PDF tohoto dokumentu):

  1. %rsp ukazuje na hromádku

    Ukazatel zásobníku obsahuje adresu bytu s nejnižší adresou, který je součástí zásobníku. Při vstupu procesu je zaručeno, že bude 16bajtově zarovnán

  2. %rdx ukazatel funkce, který by aplikace měla zaregistrovat pomocí atexitu, pokud je nenulový.

    ukazatel funkce, u kterého by se měla aplikace zaregistrovat

  3. %rbp není specifikováno, ale uživatelská země by jej měla nastavit na základní rámec.

    Obsah tohoto registru není v době inicializace procesu specifikován, ale uživatelský kód by měl označit nejhlubší rámec zásobníku nastavením ukazatele rámce na nulu.

  4. Vše ostatní není definováno.

Linux ho pak následuje „protože“ to říká LSB.


Linux
  1. Linux – co dělat, když linuxová plocha zamrzne?

  2. Co bych získal, když Sudo Program destruktivní jádra?

  3. Co dělá program, když je odeslán signál Sigkill?

  1. Co jsou linuxové procesy, vlákna, lehké procesy a stav procesu

  2. Vynechání výchozích oprávnění při připojování svazků HFS+ v linuxu

  3. Nejbezpečnější způsob rozdělení linuxu?

  1. Co je uživatel Linuxu?

  2. Linux – Co se stane, když Rsync bez cílové cesty?

  3. Linux – Které adresáře bych měl vyloučit při zálohování serveru?