GNU/Linux >> Belajar Linux >  >> Linux

Apa status register default saat program diluncurkan (asm, linux)?

Ini sepenuhnya bergantung pada ABI untuk setiap platform. Karena Anda menyebutkan eax dan ebx mari kita lihat apa masalahnya dengan x86. Di fs/binfmt_elf.c baris #972, di dalam load_elf_binary() , kernel memeriksa apakah ABI menentukan persyaratan apa pun untuk nilai register saat memuat program:

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

Ini kemudian memanggil ELF_PLAT_INIT , yang merupakan makro yang ditentukan untuk setiap arsitektur di arch/xxx/include/elf.h . Untuk x86, ini melakukan hal berikut:

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

Jadi, ketika biner ELF Anda yang terhubung secara statis dimuat di Linux x86, Anda dapat mengandalkan semua nilai register sama dengan nol. Namun, bukan berarti Anda harus melakukannya. :-)

Tautan dinamis

Perhatikan bahwa menjalankan secara dinamis biner tertaut benar-benar menjalankan kode penaut dinamis dalam proses Anda sebelum eksekusi mencapai _start Anda (titik masuk ELF). Ini dapat dan memang meninggalkan sampah di register, sebagaimana diizinkan oleh ABI. Kecuali tentu saja untuk stack pointer ESP/RSP dan atexit kaitkan EDX/RDX.


Untuk sistem AMD64 atau x86-64 (64 bit) di Linux, ABI x86-64 menentukan konten awal register.

Ada spesifikasi serupa untuk i386 ABI, ARM ABI, dll.

Lihat halaman wikipedia tentang ELF dan ABI


x86-64 Sistem V ABI

3.4.1 "Stack Awal dan Status Daftar" (Basile ditautkan ke versi PDF ini):

  1. %rsp menunjuk ke tumpukan

    Penunjuk tumpukan memegang alamat byte dengan alamat terendah yang merupakan bagian dari tumpukan. Ini dijamin 16-byte selaras pada entri proses

  2. %rdx penunjuk fungsi yang harus didaftarkan aplikasi dengan atexit jika bukan nol.

    penunjuk fungsi yang harus didaftarkan oleh aplikasi

  3. %rbp tidak ditentukan tetapi userland harus menyetelnya ke bingkai dasar.

    Konten register ini tidak ditentukan pada waktu inisialisasi proses, tetapi kode pengguna harus menandai bingkai tumpukan terdalam dengan menyetel penunjuk bingkai ke nol.

  4. Segala sesuatu yang lain tidak ditentukan.

Linux kemudian mengikutinya "karena" LSB mengatakan demikian.


Linux
  1. Linux – Apa yang Harus Dilakukan Saat Desktop Linux Membeku?

  2. Linux – Apa Yang Terjadi Saat Anda Rsync Tanpa Jalur Tujuan??

  3. Apa itu Proses Linux, Utas, Proses Ringan, dan Status Proses

  1. Apa yang saya gunakan di linux untuk membuat program python dapat dieksekusi

  2. Ketika assert() gagal, apa kode keluar programnya?

  3. Bagaimana status dukungan driver video Linux saat ini?

  1. Apa yang Akan Saya Dapatkan Saat Sudo Program Penghancur Kernel?

  2. Melewati izin default saat memasang volume HFS+ di linux

  3. Linux - Direktori apa yang harus saya kecualikan saat mencadangkan server?