रेड जोन का उद्देश्य क्या है?


12

स्टैक पॉइंटर से परे मेमोरी में रेड ज़ोन एक निश्चित आकार का क्षेत्र है जिसे "आवंटित" नहीं किया गया है। कंपाइलर साधारण पत्ती कार्यों में उस क्षेत्र तक पहुंचने के लिए असेंबली उत्पन्न करते हैं।

लेकिन मैं लाल क्षेत्र के लिए कोई वास्तविक लाभ नहीं देख सकता। स्टैक पॉइंटर से परे मेमोरी एक्सेस करना वास्तव में खतरनाक है और इससे आसानी से डेटा भ्रष्टाचार हो सकता है । ऐसा भी क्यों? 2 प्रोसेसर निर्देश सहेजना (ईबीपी; पुश ईबप एस्प) वास्तविक गति नहीं देगा।

जवाबों:


16

रेड ज़ोन, विशुद्ध रूप से और बस, एक अनुकूलन है जो निर्देशों को बचा सकता है। इसका मतलब यह है कि हर फ़ंक्शन के लिए उत्सर्जित कोड के लिए यह आवश्यक नहीं है कि स्टैक पॉइंटर से घटाना जैसे स्थानीय भंडारण करना

sub XXX, %rsp 

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

यदि आपको स्टैक पॉइंटर से उप नहीं करना है, तो उत्सर्जित कोड आरएसपी को आधार पॉइंटर के रूप में उपयोग कर सकता है, सामान्य रूप से आरबीपी के लिए आरक्षित नौकरी, और उत्सर्जित कोड आरबीपी को एक अन्य सामान्य प्रयोजन रजिस्टर के रूप में उपयोग कर सकता है।

इसका अर्थ अंततः प्रत्येक फ़ंक्शन कॉल का प्रस्तावना और उपसंहार दो निर्देश बचा सकता है जो आरबीपी को बचाएगा और पुनर्स्थापित करेगा:

(ग्नू असेम्बलर)

pushq %rbp       # prologue [ two instructions not necessary ]
movq %rsp,%rbp

.... [code]

movq %rbp,%rsp   # epilogue [ two instructions not necessary ]
popq %rbp        

ध्यान दें कि gcc में आप -mno-red-ज़ोन ध्वज को पास कर सकते हैं यदि आप इसे नहीं चाहते हैं (लेकिन x86-64 ABI को इसकी आवश्यकता है)। लिनक्स कर्नेल को ABI के अनुरूप होने की आवश्यकता नहीं है और इस प्रकार सभी कर्नेल कोड को mno-red-zone के साथ संकलित किया जाता है।

इसके अलावा, स्टैक पॉइंटर से परे मेमोरी एक्सेस करना खतरनाक नहीं है यदि यह ऑपरेशन का अपेक्षित मोड है। यह केवल खतरनाक है और यह अनियोजित और अप्रत्याशित होने पर भ्रष्टाचार को जन्म दे सकता है। जब उत्सर्जित कोड करता है, तो यह जानता है कि यह क्या कर रहा है।


हां, मैं यह समझता हूं। लेकिन 1 निर्देश बचा रहा है (वास्तव में उप से) वास्तव में अनुकूलन है? मेरा मतलब है कि डेटा को दूषित करने की वास्तविक संभावना की कीमत के लिए कुछ बाइट्स और 1 प्रोसेसर चक्र की बचत करना अजीब लगता है। शायद ऐसा करने के लिए कोई अन्य कारण हैं?
अलेक्जेंडर डेज़ोबा

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

लाल क्षेत्र का केवल x86-64 ABI का हिस्सा होने के कारण ईबीपी / एस्प के बजाय rbp / rsp में संपादित और परिवर्तित किया गया है (हालाँकि कुछ भी 32 बिट रजिस्टरों के साथ एक ही तकनीक का उपयोग करने से किसी को रोकता नहीं है; लेकिन कोई भी कंपाइलर इस तरह से नहीं करते हैं;
ब्रायन ओन

1
फ़्रेम पॉइंटर की चूक रेड ज़ोन से संबंधित नहीं है - कंपाइलर स्टैक %rspको बेस पॉइंटर के रूप में उपयोग करके इंडेक्स कर सकता है ।
ऐलेकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.