GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana register fs/gs digunakan di Linux AMD64?

Lalu apa gunanya GS?

x86_64 Kernel Linux menggunakan register GS sebagai cara efisiensi untuk memperoleh tumpukan ruang kernel untuk panggilan sistem.

Register GS menyimpan alamat dasar untuk area per-cpu. Untuk memperoleh tumpukan ruang kernel, di entry_SYSCALL_64

movq    PER_CPU_VAR(cpu_current_top_of_stack), %rsp

Setelah mengembangkan PER_CPU_VAR, kami mendapatkan yang berikut:

movq    %gs:cpu_current_top_of_stack, %rsp

Untuk benar-benar menjawab fs:0 Anda pertanyaan:ABI x86_64 membutuhkan fs:0 itu berisi alamat "ditunjuk ke" oleh fs diri. Yaitu, fs:-4 memuat nilai yang disimpan di fs:0 - 4 . Fitur ini diperlukan karena Anda tidak dapat dengan mudah mendapatkan alamat yang ditunjuk oleh fs tanpa melalui kode kernel. Memiliki alamat yang tersimpan di fs:0 sehingga bekerja dengan penyimpanan lokal thread jauh lebih efisien.

Anda dapat melihat tindakan ini saat mengambil alamat variabel lokal utas:

static __thread int test = 0;

int *f(void) {
    return &test;
}

int g(void) {
    return test;
}

mengkompilasi ke

f:
    movq    %fs:0, %rax
    leaq    -4(%rax), %rax
    retq

g:
    movl    %fs:-4, %eax
    retq

i686 melakukan hal yang sama tetapi dengan %gs . Pada aarch64 hal ini tidak diperlukan karena alamat dapat dibaca dari register tls itu sendiri.


Di x86-64 ada 3 entri TLS, dua di antaranya dapat diakses melalui FS dan GS, FS digunakan secara internal oleh glibc (di IA32 ternyata FS digunakan oleh Wine dan GS oleh glibc).

Glibc membuat titik masuk TLS ke struct pthread yang berisi beberapa struktur internal untuk threading. Glibc biasanya mengacu pada struct pthread variabel sebagai pd , mungkin untuk pthread descriptor .

Pada x86-64, struct pthread dimulai dengan tcbhead_t (ini tergantung pada arsitekturnya, lihat makro TLS_DTV_AT_TP dan TLS_TCB_AT_TP ). Header Blok Kontrol Utas ini, AFAIU, berisi beberapa bidang yang diperlukan meskipun ada satu utas. DTV adalah Dynamic Thread Vector, dan berisi penunjuk ke blok TLS untuk DSO yang dimuat melalui dlopen() . Sebelum atau sesudah TCB ada blok TLS statis untuk yang dapat dieksekusi dan DSO yang ditautkan pada waktu muat (program). TCB dan DTV dijelaskan dengan cukup baik dalam dokumen TLS Ulrich Drepper (lihat diagram di bab 3).


Linux
  1. Linux – Bagaimana Cara Mengetahui Hard Disk Apa yang Ada di Sistem?

  2. Linux – Sumber Entropi Apa yang Digunakan oleh Kernel Linux?

  3. Cara mengubah alamat MAC secara permanen di Linux

  1. Cara membersihkan cache yang digunakan oleh kernel Linux

  2. Bagaimana cara menyiram cache CPU untuk wilayah ruang alamat di Linux?

  3. Bagaimana cara melihat perintah linux yang paling sering saya gunakan?

  1. Linux:Bagaimana Menemukan Driver Perangkat yang Digunakan Untuk Perangkat?

  2. Sumber entropi apa yang digunakan oleh kernel Linux?

  3. Cara menemukan alamat IP gateway di Linux