Để thực sự trả lời câu hỏi fs:0
của bạn: x86_64 ABI yêu cầu rằng fs:0
chứa địa chỉ "được trỏ tới" bởi chính số fs
. Tức là, fs:-4
tải giá trị được lưu trữ tại fs:0 - 4
. Tính năng này là cần thiết bởi vì bạn không thể dễ dàng lấy địa chỉ được trỏ đến bởi fs
mà không cần phải trải qua mã hạt nhân. Có địa chỉ được lưu trữ tại fs:0
do đó làm cho việc lưu trữ cục bộ luồng hiệu quả hơn nhiều.
Bạn có thể thấy điều này trong hành động khi bạn lấy địa chỉ của một biến địa phương chủ đề:
static __thread int test = 0;
int *f(void) {
return &test;
}
int g(void) {
return test;
}
biên dịch để
f:
movq %fs:0, %rax
leaq -4(%rax), %rax
retq
g:
movl %fs:-4, %eax
retq
i686 cũng làm như vậy nhưng với %gs
. Trên aarch64, điều này là không cần thiết vì địa chỉ có thể được đọc từ chính bản thân tls.
FS được sử dụng bởi win32 trên x86 để trỏ vào thông tin chuỗi cửa sổ - rượu chỉ phù hợp với điều đó. –