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