सवाल .Bss सेगमेंट की आवश्यकता क्यों है?


मुझे क्या पता है कि वैश्विक और स्थैतिक चर संग्रहित हैं .data सेगमेंट, और अनियमित डेटा में हैं .bss खंड। जो मुझे समझ में नहीं आता है, क्या हमारे पास अनियमित चर के लिए समर्पित सेगमेंट क्यों है? यदि एक अनियंत्रित चर के पास रन टाइम पर असाइन किया गया मान होता है, तो क्या वैरिएबल अभी भी मौजूद है .bss केवल सेगमेंट?

निम्नलिखित कार्यक्रम में, a में हे .data सेगमेंट, और b में हे .bss खंड; क्या वो सही है? अगर मेरी समझ गलत है तो कृपया मुझे सही करें।

#include <stdio.h>
#include <stdlib.h>

int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
int b[20]; /* Uninitialized, so in the .bss and will not occupy space for 20 * sizeof (int) */

int main ()
{
   ;
}  

इसके अलावा, निम्नलिखित कार्यक्रम पर विचार करें,

#include <stdio.h>
#include <stdlib.h>
int var[10];  /* Uninitialized so in .bss */
int main ()
{
   var[0] = 20  /* **Initialized, where this 'var' will be ?** */
}

96
2018-03-02 14:51


मूल


आप बीएसएस को पढ़ सकते हैं बेहतर बचाओ अंतरिक्ष। - smwikipedia


जवाब:


कारण प्रोग्राम आकार को कम करने का कारण है। कल्पना करें कि आपका सी प्रोग्राम एम्बेडेड सिस्टम पर चलता है, जहां कोड और सभी स्थिरांक सच्चे रॉम (फ्लैश मेमोरी) में सहेजे जाते हैं। इस तरह के सिस्टम में, प्रारंभिक "कॉपी-डाउन" को सभी स्थिर स्टोरेज अवधि ऑब्जेक्ट्स सेट करने के लिए निष्पादित किया जाना चाहिए, मुख्य () से पहले। यह आमतौर पर इस छद्म की तरह जाना होगा:

for(i=0; i<all_explicitly_initialized_objects; i++)
{
  .data[i] = init_value[i];
}

memset(.bss, 
       0, 
       all_implicitly_initialized_objects);

राम में .data और .bss संग्रहीत हैं, लेकिन init_value ROM में संग्रहीत है। यदि यह एक सेगमेंट था, तो रॉम को बहुत सारे शून्य से भरना पड़ा, जिससे रोम आकार में काफी वृद्धि हुई।

रैम-आधारित एक्जिक्यूटिव समान रूप से काम करते हैं, हालांकि निश्चित रूप से उनके पास कोई सच्चा रोम नहीं है।

इसके अलावा, मेमसेट की संभावना कुछ बहुत ही कुशल इनलाइन असेंबलर है, जिसका अर्थ है कि स्टार्टअप कॉपी-डाउन को तेज़ी से निष्पादित किया जा सकता है।


71
2018-03-02 15:11



स्पष्टीकरण के लिए: .डेटा और .bss के बीच एकमात्र अंतर यह है कि स्टार्ट-अप पर, "कॉपी-डाउन" अनुक्रमिक रूप से चलाया जा सकता है, इसलिए तेज़। यदि इसे दो खंडों में विभाजित नहीं किया गया था तो प्रारंभिकरण को अनियमित चर से संबंधित रैम स्पॉट को छोड़ना होगा, जिससे समय बर्बाद हो जाएगा। - Jodes


.bss सेगमेंट एक अनुकूलन है। पूरा .bss खंड को एक संख्या, शायद 4 बाइट्स या 8 बाइट्स द्वारा वर्णित किया गया है, जो चलने की प्रक्रिया में इसका आकार देता है, जबकि .data अनुभाग प्रारंभिक चर के आकार के योग के रूप में बड़ा है। इस प्रकार .bss एक्जिक्यूटिव को लोड करने के लिए छोटे और तेज़ बनाता है। अन्यथा, चर में हो सकता है .data शून्य के लिए स्पष्ट प्रारंभ के साथ खंड; अंतर को बताने के लिए कार्यक्रम को दबाया जाएगा। (विस्तार से, वस्तुओं का पता में .bss अगर यह था तो शायद पते से अलग होगा .data खंड।)

पहले कार्यक्रम में, a में होगा .data सेगमेंट और b में होगा .bss निष्पादन योग्य का खंड। एक बार कार्यक्रम लोड हो जाने के बाद, भेद असंभव हो जाता है। चलने के समय पर, b पर 20 * sizeof(int) बाइट्स।

दूसरे कार्यक्रम में, var आवंटित स्थान और असाइनमेंट आवंटित किया गया है main() उस जगह को संशोधित करता है। ऐसा होता है कि के लिए जगह var में वर्णित किया गया था .bss के बजाय सेगमेंट .data सेगमेंट, लेकिन यह चलने पर प्रोग्राम व्यवहार करने के तरीके को प्रभावित नहीं करता है।


71
2018-03-02 14:58



उदाहरण के लिए, लंबाई में 4096 बाइट्स के कई अनियमित बफर होने पर विचार करें। क्या आप उन सभी 4k बफर बाइनरी के आकार में योगदान देना चाहते हैं? वह बहुत बर्बाद जगह होगी। - Jeff Mercado
@ जोनाथेन हत्यारा: पूरे बीएसएस सेगमेंट को एकल संख्या द्वारा क्यों वर्णित किया गया है ?? - Suraj Jain
@ सूरजजैन: संग्रहित संख्या शून्य से भरे बाइट्स की संख्या है। जब तक कोई ऐसा प्रारंभिक चर नहीं होता है, तब तक बीएसएस अनुभाग की लंबाई शून्य नहीं होगी, भले ही कार्यक्रम के लोड होने के बाद सभी बाइट्स बीएसएस अनुभाग शून्य हो जाएंगे। - Jonathan Leffler
निष्पादन योग्य में .bss अनुभाग बस एक संख्या है। इन-मेमोरी प्रक्रिया छवि में .bss अनुभाग सामान्य रूप से .डेटा अनुभाग के समीप स्मृति है और अक्सर रनटाइम। डेटा अनुभाग को .bss के साथ जोड़ा जाता है; रनटाइम मेमोरी में कोई भेद नहीं है। कभी-कभी, आप पाते हैं कि बीएसएस कहां शुरू हुआ (edata)। व्यावहारिक शब्दों में, प्रक्रिया छवि पूरी होने के बाद .bss स्मृति में मौजूद नहीं है; शून्य डेटा डेटा। डेटा अनुभाग का सरल हिस्सा है। लेकिन विवरण ओ / एस आदि के आधार पर भिन्न होते हैं। - Jonathan Leffler
@ सूरजजैन: समय समाप्त हो गया। बहुत ज्यादा चैट मुझे कुछ काम करने का नाटक करना है। - Jonathan Leffler


खैर, सबसे पहले, आपके उदाहरण में वे चर नहीं हैं; सी निर्दिष्ट करता है कि स्थिर वैरिएबल अन्यथा शुरू नहीं किए गए हैं 0 को प्रारंभ किया गया है।

इसलिए .bss का कारण छोटे निष्पादन योग्य, अंतरिक्ष को बचाने और प्रोग्राम की तेज़ी से लोड करने की इजाजत है, क्योंकि लोडर डिस्क से डेटा कॉपी करने के बजाय ज़ीरो का एक गुच्छा आवंटित कर सकता है।

प्रोग्राम चलाते समय, प्रोग्राम लोडर स्मृति में .data और .bss लोड करेगा। .Data या .bss में रहने वाली वस्तुओं में लिखता है, इस प्रकार केवल स्मृति पर जाता है, वे किसी भी बिंदु पर डिस्क पर बाइनरी तक नहीं पहुंचे जाते हैं।


9
2018-03-02 14:57





से असेंबली भाषा चरण-दर-चरण: लिनक्स के साथ प्रोग्रामिंग जेफ डंटमैन द्वारा, के बारे में ।डेटा अनुभाग:

।डेटा खंड में प्रारंभिक डेटा आइटम्स की डेटा परिभाषाएं शामिल हैं। प्रारंभ   डेटा वह डेटा होता है जिसमें प्रोग्राम शुरू होने से पहले एक मान होता है। ये मूल्य   निष्पादन योग्य फ़ाइल का हिस्सा हैं। जब वे स्मृति में लोड होते हैं   निष्पादन योग्य फ़ाइल निष्पादन के लिए स्मृति में लोड किया गया है।

.डेटा अनुभाग के बारे में याद रखने की महत्वपूर्ण बात यह है कि   आपके द्वारा परिभाषित अधिक प्रारंभिक डेटा आइटम, निष्पादन योग्य फ़ाइल जितनी बड़ी होगी   होगा, और इसे डिस्क से स्मृति में लोड करने में अधिक समय लगेगा   जब आप इसे चलाते हैं।

और यह .bss अनुभाग:

प्रोग्राम शुरू होने से पहले सभी डेटा आइटम्स को मूल्यों की आवश्यकता नहीं होती है।   जब आप डिस्क फ़ाइल से डेटा पढ़ रहे हैं, उदाहरण के लिए, आपको एक होना चाहिए   डेटा से डिस्क में आने के बाद जाने के लिए जगह रखें। इस तरह के डेटा बफर हैं   में परिभाषित .bss आपके कार्यक्रम का खंड आपने कुछ संख्या को अलग कर दिया है   बफर के लिए बाइट्स और बफर को एक नाम दें, लेकिन आप यह नहीं मानते कि कौन से मूल्य हैं   बफर में मौजूद होना है।

.Data में परिभाषित डेटा आइटम्स के बीच एक महत्वपूर्ण अंतर है   अनुभाग और डेटा आइटम .bs अनुभाग में परिभाषित: डेटा आइटम में   .डेटा अनुभाग आपके निष्पादन योग्य फ़ाइल के आकार में जोड़ें। में डेटा आइटम   .bss अनुभाग नहीं है। एक बफर जो 16,000 बाइट लेता है (या अधिक,   कभी-कभी बहुत कुछ) .bss में परिभाषित किया जा सकता है और लगभग कुछ भी नहीं जोड़ सकता है   (विवरण के लिए लगभग 50 बाइट) निष्पादन योग्य फ़ाइल आकार में।


9
2018-05-31 09:42





विकिपीडिया लेख .bss एक अच्छा ऐतिहासिक स्पष्टीकरण प्रदान करता है, यह देखते हुए कि यह शब्द 1 9 50 के दशक के मध्य से है (यिपी मेरा जन्मदिन ;-)।

दिन में वापस, हर बिट कीमती थी, इसलिए आरक्षित रिक्त स्थान को सिग्नल करने के लिए कोई भी विधि उपयोगी थी। इस (.bss) वह है जो अटक गया है।

।डेटा अनुभाग उस स्थान के लिए हैं जो खाली नहीं है, बल्कि इसमें आपके (आपके) परिभाषित मान दर्ज किए जाएंगे।


2
2017-07-20 13:00





सिस्टम वी एबीआई 4.1 (1 99 7) (एकेए ईएलएफ विनिर्देश) में भी उत्तर है:

.bss इस खंड में अनियंत्रित डेटा है जो योगदान देता है   कार्यक्रम की स्मृति छवि। परिभाषा के अनुसार, प्रणाली शुरू होती है   प्रोग्राम चलाने के लिए शुरू होने पर शून्य के साथ डेटा। अनुभाग में कोई फ़ाइल स्थान नहीं है, जैसा कि अनुभाग प्रकार द्वारा इंगित किया गया है, SHT_NOBITS

अनुभाग का नाम कहता है .bss आरक्षित है और विशेष रूप से यह विशेष प्रभाव है कोई फ़ाइल स्थान पर कब्जा नहीं है, इस प्रकार लाभ .data

नकारात्मकता निश्चित रूप से है कि सभी बाइट्स को सेट किया जाना चाहिए 0 जब ओएस उन्हें स्मृति पर रखता है, जो अधिक प्रतिबंधित है, लेकिन एक आम उपयोग केस है, और अनियमित चर के लिए ठीक काम करता है।

SHT_NOBITS सेक्शन टाइप प्रलेखन उस पुष्टि को दोहराता है:

sh_size यह सदस्य अनुभाग का आकार बाइट्स में देता है। जब तक कि सेक-   टयन प्रकार है SHT_NOBITS , खंड पर कब्जा कर लिया sh_size   फ़ाइल में बाइट्स। प्रकार का एक वर्ग SHT_NOBITS एक शून्य हो सकता है   आकार, लेकिन यह फ़ाइल में कोई जगह नहीं है।

सी मानक वर्गों के बारे में कुछ भी नहीं कहता है, लेकिन हम आसानी से सत्यापित कर सकते हैं कि लिनक्स में चर कहाँ संग्रहीत किया जाता है objdump तथा readelf, और निष्कर्ष निकाला है कि अनियमित ग्लोबल वास्तव में संग्रहित हैं .bssउदाहरण के लिए, यह उत्तर देखें: https://stackoverflow.com/a/36725211/895245


2
2018-04-19 17:40



@Downvoters कृपया समझाओ। क्या मैंने मानक कोट के साथ मौजूदा उत्तरों में थोड़ा सुधार नहीं किया है? ;-) - Ciro Santilli 新疆改造中心 六四事件 法轮功