Para responder a su pregunta en realidad fs:0
: El x86_64 ABI requiere que fs:0
contiene la dirección "señaló que" por fs
sí. Es decir, fs:-4
carga el valor almacenado en fs:0 - 4
. Esta función es necesaria porque no puede obtener fácilmente la dirección apuntada por fs
sin pasar por el código del kernel. Tener la dirección almacenada en fs:0
hace que trabajar con el almacenamiento local de subprocesos sea mucho más eficiente.
se puede ver esto en acción cuando se toma la dirección de una variable local de rosca:
static __thread int test = 0;
int *f(void) {
return &test;
}
int g(void) {
return test;
}
compila a
f:
movq %fs:0, %rax
leaq -4(%rax), %rax
retq
g:
movl %fs:-4, %eax
retq
i686 hace lo mismo pero con %gs
. En aarch64 esto no es necesario porque la dirección se puede leer desde el propio registro tls.
FS es utilizado por win32 en x86 para apuntar a la información del hilo de la ventana - el vino simplemente lo está igualando. –