“FS” / “GS” रजिस्टर किसके लिए है?


102

तो मुझे पता है कि निम्नलिखित रजिस्टर और उनके उपयोग क्या होने चाहिए:

  • सीएस = कोड सेगमेंट (आईपी के लिए प्रयुक्त)

  • DS = डेटा सेगमेंट (MOV के लिए प्रयुक्त)

  • ES = डेस्टिनेशन सेगमेंट (MOVS इत्यादि के लिए प्रयुक्त)

  • SS = स्टैक सेगमेंट (SP के लिए प्रयुक्त)

लेकिन निम्नलिखित रजिस्टरों का उपयोग करने के लिए क्या करना है?

  • FS = "फ़ाइल सेगमेंट"?

  • जीएस = ???

नोट: मैं किसी विशेष ऑपरेटिंग सिस्टम के बारे में नहीं पूछ रहा हूं - मैं सीपीयू द्वारा उपयोग किए जाने वाले उद्देश्य के बारे में पूछ रहा हूं, अगर कुछ भी हो।


24
जहां तक ​​मुझे पता है, इन दोनों में एफ और जी किसी भी चीज के लिए नहीं खड़े होते हैं। यह सिर्फ इतना है कि छह उपयोगकर्ता-विशिष्ट सेगमेंट रजिस्टरों के लिए सीपीयू (और निर्देश सेट में) कमरा था, और किसी ने देखा कि "एस" कील सेगमेंट के अलावा, अक्षर "सी" और "डी" (कोड और डेटा) अनुक्रम में थे, इसलिए "ई" "अतिरिक्त" खंड था, और फिर "एफ" और "जी" का अनुसरण किया गया।
torek

3
हो सकता था, यह जानना हमेशा कठिन होता है कि जब तक आप वहां मौजूद थे (तब तक मैं किसी और के सिर पर क्या चल रहा था, और मैं दूसरे तट पर था, कहीं भी इंटेल की डिजाइन टीम के पास नहीं था)।
torek

20
ज़रा सोचिए कि बीएस रजिस्टर से हमें कितना मज़ा आ सकता था: -}
इरा बैक्सटर

5
मैंने हमेशा जीएस को "ग्राफिक्स सेगमेंट" के रूप में इस्तेमाल किया। :-)
ब्रायन नोबलुच

2
"जी" एनरल "एस" इलक्शन के बारे में कैसे?
SS Anne

जवाबों:


109

वहाँ है जो वे के लिए इरादा कर रहे थे, और क्या वे विंडोज और लिनक्स के लिए उपयोग किया जाता है।

सेगमेंट रजिस्टर के पीछे मूल इरादा एक प्रोग्राम को मेमोरी के कई अलग-अलग (बड़े) सेगमेंट तक पहुंचने की अनुमति देना था जो कि स्वतंत्र और एक स्थिर वर्चुअल स्टोर का हिस्सा था। यह विचार 1966 के मल्टिक्स ऑपरेटिंग सिस्टम से लिया गया था , जिसने फाइलों को केवल मेमोरी मेमोरी सेगमेंट के रूप में माना। कोई बीएस "ओपन फाइल, रिकॉर्ड नहीं, क्लोज फाइल", बस "इस मूल्य को उस वर्चुअल डेटा सेगमेंट में स्टोर करें" गंदे पेज फ्लशिंग के साथ।

हमारे वर्तमान 2010 के ऑपरेटिंग सिस्टम एक विशालकाय कदम पीछे की ओर हैं, यही वजह है कि उन्हें "यूनुक्स" कहा जाता है। आप केवल अपने प्रोसेस स्पेस के सिंगल सेगमेंट को संबोधित कर सकते हैं , जिससे एक तथाकथित "फ्लैट (IMHO सुस्त) एड्रेस स्पेस" दिया जा सकता है। X86-32 मशीन पर सेगमेंट रजिस्टर का उपयोग अभी भी वास्तविक सेगमेंट रजिस्टर के लिए किया जा सकता है, लेकिन किसी ने भी परेशान नहीं किया है (एंडी ग्रोव, पूर्व इंटेल अध्यक्ष, पिछली शताब्दी में एक प्रसिद्ध सार्वजनिक फिट था जब वह उन सभी इंटेल इंजीनियरों द्वारा ऊर्जा खर्च करने के बाद पता लगाया गया था और इस सुविधा को लागू करने के लिए उसका पैसा, कि कोई भी इसका उपयोग करने वाला नहीं था। जाओ, एंडी! "

64 बिट्स में जाने पर एएमडी ने फैसला किया कि अगर उन्होंने मल्टीिक्स को एक विकल्प के रूप में समाप्त कर दिया, तो परवाह नहीं की (यह धर्मार्थ व्याख्या है; अपरिवर्तनीय यह है कि वे मल्टीिक्स के बारे में स्पष्ट नहीं थे) और इसलिए 64 बिट मोड में खंड रजिस्टरों की सामान्य क्षमता को अक्षम कर दिया। थ्रेड लोकल स्टोर तक पहुंचने के लिए अभी भी थ्रेड्स की आवश्यकता थी, और प्रत्येक थ्रेड को आ पॉइंटर की आवश्यकता थी ... कहीं तुरंत सुलभ थ्रेड स्टेट में (जैसे, रजिस्टरों में) ... स्थानीय स्टोर को थ्रेड करने के लिए। चूंकि 32 बिट संस्करण में इस उद्देश्य के लिए विंडोज और लिनक्स दोनों ने एफएसएंड जीएस (स्पष्टीकरण के लिए धन्यवाद निक) का इस्तेमाल किया, एएमडी ने 64 बिट खंड रजिस्टर (जीएस और एफएस) को केवल इस उद्देश्य के लिए उपयोग करने का निर्णय लिया (मुझे लगता है कि आप कर सकते हैं) उन्हें अपने प्रोसेस स्पेस में कहीं भी इंगित करें; डननो अगर एप्लीकेशन कोड उन्हें लोड कर सकता है या नहीं)।

यह प्रत्येक थ्रेड के मेमोरी मैप को एक पूर्ण आभासी पता (जैसे, 0-FFF कहते हैं) बनाने के लिए आर्किटेक्चरली प्रेटियर IMHO होता, जो इसके थ्रेड लोकल स्टोरेज (नो [सेगमेंट) रजिस्टर पॉइंटर की जरूरत होती है!)। मैंने 1970 के दशक में एक 8 बिट ओएस में यह किया था और यह काम करने के लिए रजिस्टरों के एक और बड़े ढेर की तरह, बेहद आसान था।

तो, सेगमेंट रजिस्टर अब आपके अपेंडिक्स की तरह है। वे एक उद्देश्यपूर्ण सेवा करते हैं। हमारे सामूहिक नुकसान के लिए।

जो लोग इतिहास को नहीं जानते हैं, वे इसे दोहराते नहीं हैं; वे कुछ करने के लिए बर्बाद कर रहे हैं।


10
@ सुपरकार्ट: एक सरल, अधिक शानदार योजना जिसने उन्हें 65536 गुना अधिक भंडारण के रूप में संबोधित किया होगा, खंड के रजिस्टरों को निचले 16 बिट्स के पूर्ण ऊपरी 16 बिट एक्सटेंशन के रूप में माना जाएगा, जो कि संक्षेप में 286, 386 है। और बहुओं ने किया।
इरा बैक्सटर

3
@IraBaxter: उस दृष्टिकोण के साथ समस्या यह है कि 80286-शैली के खंडों में पर्याप्त मात्रा में एक से अधिक ओवरहेड होते हैं, जो प्रत्येक खंड में कई वस्तुओं को संग्रहीत करने के लिए होते हैं, और इस प्रकार दोनों खंडों को संग्रहीत करते हैं और प्रत्येक सूचक पर ऑफसेट होते हैं। इसके विपरीत, यदि कोई 16 बाइट्स के गुणकों तक मेमोरी आबंटन को राउंड करने के लिए तैयार है, तो 8086-शैली विभाजन एक ऑब्जेक्ट की पहचान के साधन के रूप में अकेले खंड का उपयोग करने की अनुमति देता है । 1980 तक 16 बाइट्स के लिए राउंडिंग आवंटन थोड़ा अनियमित हो सकता था, लेकिन आज एक जीत का प्रतिनिधित्व करेगा अगर यह प्रत्येक वस्तु संदर्भ के आकार को 8 बाइट्स से घटाकर चार कर दे।
सुपरकाट

3
उन रजिस्टरों का उपयोग आधुनिक ऑपरेटिंग सिस्टम में किया जाता है। वे ज्यादातर कार्य नियंत्रण ब्लॉकों के बारे में जानकारी देने के लिए समर्पित हैं, कम से कम दो प्रमुख ओएस में अब x86 चिप्स के लिए उपलब्ध है। और, चूंकि वे अब अपने मूल इरादे के लिए "सामान्य उद्देश्य" नहीं हैं, इसलिए आप उन्हें बहुत अधिक उपयोग नहीं कर सकते। X86-64 सिस्टम पर दिखावा करने के लिए बेहतर है कि वे केवल तब तक मौजूद न हों, जब तक आपको जानकारी की आवश्यकता न हो कि वे आपको थ्रेड कंट्रोल ब्लॉक में एक्सेस करने दें।
इरा बैक्सटर

5
परिशिष्ट सादृश्य वास्तव में पुराने विज्ञान पर आधारित बुरा है; यह प्रतिरक्षा प्रणाली से संबंधित है, इसलिए निश्चित रूप से नहीं "बाक़ी"। यह वास्तविक पोस्ट से अलग हो जाता है। इसके अलावा, यह एक अच्छी प्रतिक्रिया है।
code_dredd

5
खंडित बनाम चपटी मेमोरी के मनोरंजक, नो-होल्ड-बैरेड ट्रीटमेंट के लिए धन्यवाद :) 6809 (साथ में और बिना पेडी मेमोरी के), 6502, z80, 68k और 80 [123]? मेमोरी एक हॉरर शो है और मुझे खुशी है कि इसे इतिहास के कूड़ेदान में डाला गया। थ्रेड_लोक डेटा की कुशल पहुंच के लिए एफएस और जीएस का उपयोग एक ऐतिहासिक त्रुटि का एक सुखद अनपेक्षित परिणाम है।
रिचर्ड होजेस

44

रजिस्टर FSऔर GSसेगमेंट रजिस्टर हैं। उनके पास कोई प्रोसेसर-परिभाषित उद्देश्य नहीं है, लेकिन इसके बजाय ओएस द्वारा उन्हें चलाने का उद्देश्य दिया गया है। विंडोज 64-बिट में GSरजिस्टर का उपयोग ऑपरेटिंग सिस्टम परिभाषित संरचनाओं को इंगित करने के लिए किया जाता है। FSऔर GSआमतौर पर ओएस कर्नेल द्वारा थ्रेड-विशिष्ट मेमोरी तक पहुंचने के लिए उपयोग किया जाता है। खिड़कियों में, GSरजिस्टर का उपयोग थ्रेड-विशिष्ट मेमोरी को प्रबंधित करने के लिए किया जाता है। लिनक्स कर्नेल GScpu- विशिष्ट मेमोरी तक पहुंचने के लिए उपयोग करता है।


1
क्या वे ओएस-परिभाषित उद्देश्यों के लिए उपयोग किए जाने वाले थे, या कोड को सुविधाजनक बनाने के लिए जो कुछ ऐसा करने की आवश्यकता होती है, *dest++ = lookup[*src++];जो अन्यथा अन्यथा अजीब होगा यदि भाग्य, लुकअप और src तीन असंबंधित स्थानों पर थे।
सुपरकाट

8
विंडोज एफएस पर वास्तव में थ्रेड विशिष्ट भंडारण के लिए है। FS द्वारा
बताए

2
यह सिर्फ विंडोज पर नहीं है। ओएस एक्स पर टीएलएस के लिए जीएस का भी उपयोग किया जाता है। संदर्भ स्विच के दौरान सिस्टम संरचनाओं का ट्रैक रखने के लिए जीएस का उपयोग 64 बिट कर्नेल द्वारा भी किया जाता है। OS उस प्रभाव के लिए SWAPGS का उपयोग करेगा।
ईटी

12

FS का उपयोग थ्रेड सूचना ब्लॉक (TIB) को विंडोज़ प्रक्रियाओं पर इंगित करने के लिए किया जाता है।

एक विशिष्ट उदाहरण ( एसईएच ) है जो एक पॉइंटर को कॉलबैक फ़ंक्शन में संग्रहीत करता है FS:[0x00]

जीएस आमतौर पर एक थ्रेड स्थानीय भंडारण (टीएलएस) के लिए एक संकेतक के रूप में उपयोग किया जाता है। और एक उदाहरण जो आपने पहले देखा होगा वह स्टैक कैनरी प्रोटेक्शन (स्टैकगार्ड) है, जीसीसी में आप कुछ इस तरह देख सकते हैं:

mov    eax,gs:0x14
mov    DWORD PTR [ebp-0xc],eax

2
यह वास्तव में सवाल का जवाब नहीं देता है। नोट में
माइकल पेट सेप

9
@MichaelPetch फिर मैं जानता हूं कि मैं इसे उन लोगों के लिए अच्छी जानकारी के रूप में जोड़ना चाहता हूं जिन्होंने इस q / s को एसओ में पढ़ा है
zerocool

2

इंटेल मैनुअल के अनुसार, 64-बिट मोड में इन रजिस्टरों को कुछ रैखिक पता गणनाओं में अतिरिक्त आधार रजिस्टरों के रूप में उपयोग करने का इरादा है। मैंने इसे खंड ४.३.४.१ (पृष्ठ ४६ में ४ मात्रा सेट में) से खींचा। आमतौर पर जब सीपीयू इस मोड में होता है, तो रैखिक पता प्रभावी पते के समान होता है, क्योंकि इस मोड में अक्सर विभाजन का उपयोग नहीं किया जाता है।

इसलिए इस फ्लैट एड्रेस स्पेस में, एफएस एंड जीएस न केवल स्थानीय डेटा बल्कि कुछ निश्चित ऑपरेटिंग सिस्टम डेटा स्ट्रक्चर्स (पेज 2793, सेक्शन 3.2.4) को संबोधित करने में भूमिका निभाते हैं, इस प्रकार इन रजिस्टरों को ऑपरेटिंग सिस्टम द्वारा उपयोग करने का इरादा था, हालांकि उन विशेष डिजाइनरों निर्धारण करते हैं।

32 और 64-बिट मोड दोनों में ओवरराइड्स का उपयोग करते समय कुछ दिलचस्प चालबाजी है लेकिन इसमें विशेषाधिकार प्राप्त सॉफ्टवेयर शामिल है।

"मूल इरादों" के दृष्टिकोण से, यह कहना मुश्किल है कि वे केवल अतिरिक्त रजिस्टर हैं। जब सीपीयू वास्तविक पता मोड में होता है , तो यह ऐसा होता है कि प्रोसेसर 8086 की उच्च गति के रूप में चल रहा है और इन रजिस्टरों को एक प्रोग्राम द्वारा स्पष्ट रूप से एक्सेस किया जाना है। सच्चे 8086 एमुलेशन के लिए आप CPU को वर्चुअल -8086 मोड में चलाएंगे और इन रजिस्टरों का उपयोग नहीं किया जाएगा।


2

टी एल; डॉ;

“FS” / “GS” रजिस्टर किसके लिए है?

बस डिफ़ॉल्ट डेटा खंड (डीएस) से परे डेटा का उपयोग करने के लिए। बिल्कुल ES की तरह।


लंबे समय से पढ़ें:

तो मुझे पता है कि निम्नलिखित रजिस्टर और उनके उपयोग क्या होने चाहिए:

[...]

खैर, लगभग लेकिन डीएस 'कुछ' डेटा सेगमेंट नहीं है, लेकिन डिफ़ॉल्ट एक है। क्या सभी ऑपरेशन डिफ़ॉल्ट रूप से होते हैं (* 1)। यह सभी डिफ़ॉल्ट चर स्थित हैं - अनिवार्य रूप से dataऔर bss। यह किसी तरह से इस कारण का हिस्सा है कि x86 कोड कॉम्पैक्ट क्यों नहीं है। सभी आवश्यक डेटा, जो कि सबसे अधिक बार एक्सेस किया जाता है, (प्लस कोड और स्टैक) 16 बिट आशुलिपि दूरी के भीतर है।

ES का उपयोग सब कुछ (* 2) तक पहुंचाने के लिए किया जाता है, जो कि DS के 64 KiB से आगे है। जैसे वर्ड प्रोसेसर का टेक्स्ट, स्प्रेड शीट की सेल या ग्राफिक्स प्रोग्राम का पिक्चर डेटा वगैरह। अक्सर माना जाता है, इस डेटा के रूप में ज्यादा पहुँच प्राप्त नहीं है, इसलिए एक उपसर्ग की जरूरत लंबे पते के क्षेत्रों का उपयोग करने से कम है।

इसी तरह यह केवल एक छोटी सी झुंझलाहट है कि स्ट्रिंग ऑपरेशन करते समय डीएस और ईएस को लोड (और पुनः लोड) करना पड़ सकता है - यह कम से कम अपने समय के सर्वश्रेष्ठ चरित्र हैंडलिंग निर्देश सेटों में से एक है।

जब उपयोगकर्ता डेटा 64 KiB से अधिक हो जाता है तो वास्तव में बहुत दुख होता है और संचालन शुरू करना पड़ता है। जबकि कुछ ऑपरेशन केवल एक समय (विचार A=A*2) पर एकल डेटा आइटम पर किए जाते हैं , अधिकांश के लिए दो ( A=A*B) या तीन डेटा आइटम ( A=B*C) की आवश्यकता होती है । यदि ये आइटम अलग-अलग सेगमेंट में रहते हैं, तो ईएस को कई बार ओवरहेड जोड़कर प्रति ऑपरेशन कई बार लोड किया जाएगा।

शुरुआत में, 8 बिट दुनिया (* 3) के छोटे कार्यक्रमों और समान रूप से छोटे डेटा सेट के साथ, यह कोई बड़ी बात नहीं थी, लेकिन यह जल्द ही एक प्रमुख प्रदर्शन बोतल गर्दन बन गया - और इसके लिए गधे में एक सच्चा दर्द प्रोग्रामर (और संकलक)। 386 इंटेल के साथ अंत में दो और खंडों को जोड़कर राहत पहुंचाई गई, इसलिए स्मृति में फैले तत्वों के साथ कोई भी श्रृंखला एकात्मक , बाइनरी या टर्नरी ऑपरेशन, हर समय ईएस को फिर से लोड किए बिना ले सकती है।

प्रोग्रामिंग के लिए (कम से कम असेंबली में) और कंपाइलर डिजाइन, यह काफी लाभ था। बेशक, और भी अधिक हो सकता था, लेकिन तीन बोतल की गर्दन मूल रूप से चली गई थी, इसलिए इसे ज़्यादा करने की आवश्यकता नहीं है।

E / G के बाद अक्षर F / G का नामकरण केवल अक्षर निरंतरता है। CPU डिज़ाइन के बिंदु से कम से कम कुछ भी जुड़ा नहीं है।


* 1 - स्ट्रिंग गंतव्य के लिए ES का उपयोग एक अपवाद है, क्योंकि बस दो खंड रजिस्टरों की आवश्यकता होती है। उनके बिना बहुत उपयोगी नहीं होगा - या हमेशा एक खंड उपसर्ग की जरूरत है। जो आश्चर्यजनक विशेषताओं में से एक को मार सकता है, (गैर दोहरावदार) स्ट्रिंग निर्देशों का उपयोग उनके एकल बाइट एन्कोडिंग के कारण चरम प्रदर्शन के परिणामस्वरूप होता है।

* 2 - तो hindsight में 'एवरीथिंग एल्स सेगमेंट' 'एक्स्ट्रा सेगमेंट' की तुलना में बेहतर नामकरण होगा।

* 3 - यह ध्यान रखना हमेशा महत्वपूर्ण है कि 8086 केवल स्टॉप गैप माप के रूप में था जब तक कि 8800 समाप्त नहीं हुआ और मुख्य रूप से एम्बेडेड दुनिया के लिए 8080/85 ग्राहकों को बोर्ड पर रखने का इरादा था।


1
वाह, यह सब समझाने के लिए धन्यवाद! यह बहुत कुछ समझाता है और बहुत समझ में आता है! +1
user541686
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.