वास्तव में अपने fs:0
प्रश्न का उत्तर देने के लिए: x86_64 एबीआई को fs:0
में fs
द्वारा "इंगित किया गया" पता है। यही है, fs:-4
fs:0 - 4
पर संग्रहीत मूल्य लोड करता है। यह सुविधा जरूरी है क्योंकि आप कर्नेल कोड के बिना fs
द्वारा आसानी से पता लगा सकते हैं। fs:0
पर संग्रहीत पता होने के कारण इस प्रकार थ्रेड स्थानीय भंडारण के साथ काम करना अधिक कुशल होता है।
आप कार्रवाई में देख सकते हैं जब आप एक धागा स्थानीय चर का पता ले: एक ही लेकिन %gs
के साथ करता है करने के लिए
f:
movq %fs:0, %rax
leaq -4(%rax), %rax
retq
g:
movl %fs:-4, %eax
retq
i686
static __thread int test = 0;
int *f(void) {
return &test;
}
int g(void) {
return test;
}
संकलित करता है। Aarch64 पर यह आवश्यक नहीं है क्योंकि पते को टीएलएस रजिस्टर से ही पढ़ा जा सकता है।
एफएस का उपयोग x86 पर x32 पर विंडोज थ्रेड जानकारी पर इंगित करने के लिए किया जाता है - शराब बस उससे मेल खाता है। –