बस त्रुटि (बस एरर): Difference between revisions

From Vigyanwiki
No edit summary
Line 1: Line 1:
[[ कम्प्यूटिंग |कम्प्यूटिंग]] में, बस त्रुटि हार्डवेयर द्वारा स्थापित किया गया  [[ट्रैप (कंप्यूटिंग)]] है, [[ऑपरेटिंग सिस्टम]] (ओस) को सूचित करता है कि प्रक्रिया [[कंप्यूटर डेटा भंडारण|स्मृति]] तक पहुँचने की कोशिश कर रही है जिसे [[सेंट्रल प्रोसेसिंग यूनिट]] भौतिक रूप से संबोधित नहीं कर सकती है: [[ पता बस ]] के लिए अमान्य पता, इसके कारण नाम। अधिकांश आर्किटेक्चर पर आधुनिक उपयोग में ये सेगमेंटेशन दोषों की तुलना में बहुत दुर्लभ हैं, जो मुख्य रूप से मेमोरी एक्सेस उल्लंघनों के कारण होते हैं: ''तार्किक''  पता या अनुमतियां में समस्याएं  है।
[[ कम्प्यूटिंग |कम्प्यूटिंग]] में, बस त्रुटि हार्डवेयर द्वारा स्थापित किया गया  [[ट्रैप (कंप्यूटिंग)]] है, [[ऑपरेटिंग सिस्टम]] (ओएस) को सूचित करता है कि प्रक्रिया [[कंप्यूटर डेटा भंडारण|स्मृति]] तक पहुँचने की कोशिश कर रही है जिसे [[सेंट्रल प्रोसेसिंग यूनिट]] भौतिक रूप से संबोधित नहीं कर सकती है: [[ पता बस | एड्रेस बस]] के लिए अमान्य एड्रेस है। अधिकांश आर्किटेक्चर पर आधुनिक उपयोग में ये सेगमेंटेशन दोषों की तुलना में बहुत दुर्लभ हैं, जो मुख्य रूप से मेमोरी एक्सेस उल्लंघनों के कारण होते हैं: ''तार्किक''  एड्रेस या अनुमतियां में समस्याएं  है।


[[पॉज़िक्स]]-अनुपालन प्लेटफॉर्म पर, बस त्रुटियों का परिणाम सामान्यतः सिगबस सिग्नल को प्रक्रिया में भेजा जा रहा है जो त्रुटि का कारण बनता है। SIGBUS किसी भी सामान्य उपकरण दोष के कारण भी हो सकता है जिसका कंप्यूटर पता लगाता है, हालांकि बस त्रुटि का शायद ही कभी मतलब होता है कि [[कंप्यूटर हार्डवेयर]] भौतिक रूप से टूटा हुआ है - यह आमतौर पर [[कंप्यूटर प्रोग्राम]] में [[सॉफ्टवेयर बग]] के कारण होता है।{{citation needed|date=January 2014}} कुछ अन्य पेजिंग त्रुटियों के लिए भी बस त्रुटियाँ उठाई जा सकती हैं; नीचे देखें।
[[पॉज़िक्स]]-अनुपालन प्लेटफॉर्म पर, बस त्रुटियों का परिणाम सामान्यतः सिगबस सिग्नल को प्रक्रिया में भेजा जा रहा है जो त्रुटि का कारण बनता है। सिगबस किसी भी सामान्य उपकरण दोष के कारण भी हो सकता है जिसका कंप्यूटर एड्रेस लगाता है, बस त्रुटि का संभवतः ही कभी तात्पर्य होता है कि [[कंप्यूटर हार्डवेयर]] भौतिक रूप से टूटा हुआ है - यह सामान्यतः [[सॉफ्टवेयर बग|सॉफ्टवेयर]] में [[सॉफ्टवेयर बग|बग]] के कारण होता है।{{citation needed|date=January 2014}} कुछ अन्य पेजिंग त्रुटियों के लिए बस त्रुटियां भी उठाई जा सकती हैं; नीचे देखें।


== कारण ==
== कारण ==
बस त्रुटियों के कम से कम तीन मुख्य कारण हैं:
बस त्रुटियों के तीन मुख्य कारण हैं:


=== गैर-मौजूद पता ===
=== गैर-मौजूद एड्रेस ===
सॉफ्टवेयर सीपीयू को विशिष्ट भौतिक [[ स्मृति पता ]] को पढ़ने या लिखने का निर्देश देता है। तदनुसार, सीपीयू इस भौतिक पते को अपनी पता बस पर सेट करता है और सीपीयू से जुड़े अन्य सभी हार्डवेयर को परिणामों के साथ प्रतिक्रिया देने का अनुरोध करता है, यदि वे इस विशिष्ट पते के लिए उत्तर देते हैं। यदि कोई अन्य हार्डवेयर प्रतिक्रिया नहीं करता है, तो सीपीयू यह बताते हुए  अपवाद प्रबंधन करता है कि अनुरोधित भौतिक पता पूरे कंप्यूटर सिस्टम द्वारा पहचाना नहीं गया है। ध्यान दें कि यह केवल भौतिक मेमोरी पतों को कवर करता है। अपरिभाषित [[ आभासी मेमोरी ]] एड्रेस तक पहुँचने की कोशिश को आम तौर पर  बस त्रुटि के बजाय विभाजन दोष माना जाता है, हालाँकि यदि [[मेमोरी प्रबंधन इकाई]] अलग है, तो प्रोसेसर अंतर नहीं बता सकता है।
सॉफ्टवेयर सीपीयू को विशिष्ट भौतिक [[ स्मृति पता |मेमोरी एड्रेस]] को पढ़ने या लिखने का निर्देश देता है। तदनुसार, सीपीयू इस भौतिक एड्रेस को अपनी एड्रेस बस पर स्थापित करता है और सीपीयू से जुड़े अन्य सभी हार्डवेयर को परिणामों के साथ प्रतिक्रिया देने का अनुरोध करता है, यदि वे इस विशिष्ट एड्रेस के लिए उत्तर देते हैं। यदि कोई अन्य हार्डवेयर प्रतिक्रिया नहीं करता है, तो सीपीयू अपवाद प्रबंधन करता है कि अनुरोधित भौतिक एड्रेस पूरे कंप्यूटर सिस्टम द्वारा पहचाना नहीं गया है। यह भौतिक मेमोरी एड्रेस को आवरण करता है। अपरिभाषित [[ आभासी मेमोरी |आभासी मेमोरी]] एड्रेस तक पहुँचने की कोशिश को सामान्यतः बस त्रुटि के स्थान पर विभाजन दोष माना जाता है, यदि [[मेमोरी प्रबंधन इकाई]] भिन्न है, तो प्रोसेसर अंतर नहीं बता सकता है।


=== असंरेखित पहुंच ===
=== असंरेखित पहुंच ===
अधिकांश सीपीयू [[बाइट]]-एड्रेसेबल होते हैं, जहां प्रत्येक अद्वितीय मेमोरी एड्रेस 8-बिट बाइट को संदर्भित करता है। अधिकांश सीपीयू प्रत्येक मेमोरी पते से अलग-अलग बाइट्स तक पहुंच सकते हैं, लेकिन वे आम तौर पर बड़ी इकाइयों (16 बिट्स, 32 बिट्स, 64 बिट्स और इसी तरह) तक नहीं पहुंच सकते हैं, इन इकाइयों के बिना  विशिष्ट सीमा के लिए [[डेटा संरचना संरेखण]] (x[[86]]  उल्लेखनीय अपवाद है) .
अधिकांश सीपीयू [[बाइट]]-एड्रेसेबल होते हैं, जहां प्रत्येक अद्वितीय मेमोरी एड्रेस 8-बिट बाइट को संदर्भित करता है। अधिकांश सीपीयू प्रत्येक मेमोरी एड्रेस से भिन्न-भिन्न बाइट्स तक पहुंच सकते हैं, लेकिन वे सामान्यतः बड़ी इकाइयों (16 बिट्स, 32 बिट्स, 64 बिट्स) तक नहीं पहुंच सकते हैं, इन इकाइयों को विशिष्ट सीमा के लिए [[डेटा संरचना संरेखण]] किया जा सकता है (x[[86]]  उल्लेखनीय अपवाद है) .


उदाहरण के लिए, यदि बहु-बाइट ्सेस 16 बिट-संरेखित होना चाहिए, तो 0, 2, 4, 6, और इतने पर पते (बाइट्स में दिए गए) संरेखित माने जाएंगे और इसलिए पहुंच योग्य होंगे, जबकि पते 1, 3, 5, और इतने पर असंरेखित माना जाएगा। इसी तरह, यदि मल्टी-बाइट ्सेस 32-बिट संरेखित होना चाहिए, तो 0, 4, 8, 12, और इसी तरह के पते को संरेखित माना जाएगा और इसलिए पहुंच योग्य होगा, और बीच के सभी पतों को असंरेखित माना जाएगा। असंरेखित पते पर बाइट से बड़ी इकाई तक पहुँचने का प्रयास करने से बस त्रुटि हो सकती है।
उदाहरण के लिए, यदि बहु-बाइट एक्सेस 16 बिट-संरेखित होना चाहिए, तो 0, 2, 4, 6, और एड्रेस (बाइट्स में दिए गए) संरेखित माने जाएंगे और इसलिए पहुंच योग्य होंगे, जबकि एड्रेस 1, 3, 5, और असंरेखित माना जाएगा। यदि मल्टी-बाइट एक्सेस 32-बिट संरेखित होना चाहिए, तो 0, 4, 8, 12, और इसी प्रकार के एड्रेस को संरेखित माना जाएगा और इसलिए पहुंच योग्य होगा, और मध्य के सभी एड्रेस को असंरेखित माना जाएगा। असंरेखित एड्रेस पर बाइट से बड़ी इकाई तक पहुँचने का प्रयास करने से बस त्रुटि हो सकती है।


उपयोग की जा रही वास्तुकला के आधार पर कुछ प्रणालियों में इनका संकर हो सकता है। उदाहरण के लिए, IBM System/360 मेनफ्रेम पर आधारित हार्डवेयर के लिए, जिसमें [[IBM System z]], Fujitsu B8000, RCA Spectra, और [[UNIVAC Series 90]] शामिल हैं, निर्देश 16-बिट सीमा पर होने चाहिए, यानी, निष्पादन पते  पर शुरू होने चाहिए यहां तक ​​कि बाइट।  विषम पते पर शाखा लगाने का प्रयास  विनिर्देशन अपवाद का परिणाम है।<ref>''z/Architecture Principles of Operation'', SA22-7832-04, Page 6-6, Fifth Edition (September, 2005) IBM Corporation, Poukeepsie, NY, Retrievable from http://publibfp.dhe.ibm.com/epubs/pdf/a2278324.pdf (Retrieved December 31, 2015)</ref> डेटा, हालांकि, स्मृति में किसी भी पते से पुनर्प्राप्त किया जा सकता है, और निर्देश के आधार पर  बाइट या उससे अधिक हो सकता है।
उपयोग की जा रही वास्तुकला के आधार पर कुछ प्रणालियों में इनका संकर हो सकता है। उदाहरण के लिए, आईबीएम सिस्टम/360 मेनफ्रेम पर आधारित हार्डवेयर के लिए, जिसमें [[IBM System z|आईबीएम सिस्टम]], विश्वासघाती B8000, आरसीए स्पेक्ट्रा, और [[UNIVAC Series 90|यूनीवैक सीरीज 90]] सम्मिलित हैं, निर्देश 16-बिट सीमा पर होने चाहिए, निष्पादन एड्रेस पर प्रारंभ होने चाहिए। विषम एड्रेस पर शाखा लगाने का प्रयास  विनिर्देशन अपवाद का परिणाम है।<ref>''z/Architecture Principles of Operation'', SA22-7832-04, Page 6-6, Fifth Edition (September, 2005) IBM Corporation, Poukeepsie, NY, Retrievable from http://publibfp.dhe.ibm.com/epubs/pdf/a2278324.pdf (Retrieved December 31, 2015)</ref> डेटा, स्मृति में किसी भी एड्रेस से पुनर्प्राप्त किया जा सकता है, और निर्देश के आधार पर  बाइट या उससे अधिक हो सकता है।


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


===[[पेजिंग]] त्रुटियाँ===
===[[पेजिंग]] त्रुटियाँ===
[[FreeBSD]], [[Linux]] और Solaris (ऑपरेटिंग सिस्टम)  बस त्रुटि का संकेत दे सकते हैं जब वर्चुअल मेमोरी पेज पेजिंग नहीं कर सकते हैं, उदा। क्योंकि यह गायब हो गया है (उदाहरण के लिए [[मेमोरी-मैप की गई फ़ाइल]] तक पहुँचना या  [[निष्पादन]] योग्य को निष्पादित करना जो प्रोग्राम के चलने के दौरान छोटा कर दिया गया है),<ref>{{Cite web|url=https://groups.google.com/group/comp.unix.internals/browse_thread/thread/6369e8f923aedcb0/54f8ed15e326dc0|title = What is SIGBUS - Object specific hardware error?}}</ref>{{unreliable source?|date=June 2016}} या क्योंकि अभी-अभी बनाई गई मेमोरी-मैप की गई फ़ाइल को भौतिक रूप से आवंटित नहीं किया जा सकता है, क्योंकि डिस्क भरी हुई है।<!--technically the filesystem-->
[[FreeBSD]], [[Linux|लिनक्स]] और सोलारिस (ऑपरेटिंग सिस्टम)  बस त्रुटि का संकेत दे सकते हैं जब वर्चुअल मेमोरी पेज पेजिंग नहीं कर सकते हैं, उदा। क्योंकि यह लुप्त हो गया है (उदाहरण के लिए [[मेमोरी-मैप की गई फ़ाइल]] तक पहुँचना या  [[निष्पादन]] योग्य को निष्पादित करना जो प्रोग्राम के चलने के समय छोटा कर दिया गया है),<ref>{{Cite web|url=https://groups.google.com/group/comp.unix.internals/browse_thread/thread/6369e8f923aedcb0/54f8ed15e326dc0|title = What is SIGBUS - Object specific hardware error?}}</ref>{{unreliable source?|date=June 2016}} क्योंकि अभी-अभी बनाई गई मेमोरी-मैप की गई फ़ाइल को भौतिक रूप से आवंटित नहीं किया जा सकता है, क्योंकि डिस्क भरी हुई है।<!--technically the filesystem-->




=== गैर-वर्तमान खंड (x86) ===
=== गैर-वर्तमान खंड (x86) ===
X86 पर  पुराना स्मृति प्रबंधन तंत्र उपस्थित है जिसे [[X86 मेमोरी सेगमेंटेशन|विभाजन]] के रूप में जाना जाता है। यदि अनुप्रयोग गैर-उपस्थित खंड के चयनकर्ता के साथ सेगमेंट रजिस्टर लोड करता है (जो पोसिस -अनुपालन ओस के अंतर्गत एकमात्र असेंबली भाषा के साथ किया जा सकता है), अपवाद उत्पन्न होता है। कुछ ओएसई ने स्वैपिंग के लिए इसका उपयोग किया, लेकिन नीचे लिनक्स यह सिगबस उत्पन्न करता है।
X86 पर  प्राचीन स्मृति प्रबंधन तंत्र उपस्थित है जिसे [[X86 मेमोरी सेगमेंटेशन|विभाजन]] के रूप में जाना जाता है। यदि अनुप्रयोग गैर-उपस्थित खंड के चयनकर्ता के साथ सेगमेंट रजिस्टर भार करता है (जो पॉज़िक्स -अनुरूप ओएस के अंतर्गत एकमात्र असेंबली भाषा के साथ किया जा सकता है), अपवाद उत्पन्न होता है। कुछ ओएसई ने परिवर्तन के लिए इसका उपयोग किया, लेकिन नीचे लिनक्स यह सिगबस उत्पन्न करता है।


== उदाहरण ==
== उदाहरण ==
यह एटी एंड टी असेंबली सिंटैक्स के साथ [[ सी (प्रोग्रामिंग भाषा) |सी (प्रोग्रामिंग भाषा)]] में लिखे गए असंरेखित मेमोरी एक्सेस का उदाहरण है।
यह एटी एंड टी असेंबली सिंटैक्स के साथ [[ सी (प्रोग्रामिंग भाषा) |सी (प्रोग्रामिंग भाषा)]] में लिखे गए असंरेखित मेमोरी एक्सेस का उदाहरण है।


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 71: Line 71:
}
}
</syntaxhighlight>
</syntaxhighlight>
पोसिस संगत ओस पर x86 पर उदाहरण को संकलित करना और चलाना त्रुटि प्रदर्शित करता है:
पॉज़िक्स संगत ओएस पर x86 पर उदाहरण को संकलित करना और चलाना त्रुटि प्रदर्शित करता है:
<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
$ gcc -ansi sigbus.c -o sigbus
$ gcc -ansi sigbus.c -o sigbus
Line 87: Line 87:
$2 = 1
$2 = 1
</syntaxhighlight>
</syntaxhighlight>
[[GDB|गड़ब]] [[डिबगर]] दिखाता है कि निरंतर (प्रोग्रामिंग) 0x2a को X86 असेंबली भाषा का उपयोग करके [[IA-32]] [[प्रोसेसर रजिस्टर|रजिस्टर]] में संग्रहीत स्थान पर संग्रहीत किया जा रहा है। यह रजिस्टर इनडायरेक्ट एड्रेसिंग का उदाहरण है।
जीडीबी डीबगर दिखाता है कि निरंतर (प्रोग्रामिंग) 0x2a को X86 असेंबली भाषा का उपयोग करके [[IA-32]] [[प्रोसेसर रजिस्टर|रजिस्टर]] में संग्रहीत स्थान पर संग्रहीत किया जा रहा है। यह रजिस्टर इनडायरेक्ट एड्रेसिंग का उदाहरण है।


एड्रेस के [[कम से कम महत्वपूर्ण बिट|निम्न क्रम बिट्स]] को प्रिंट करने से पता चलता है कि यह शब्द सीमा ( द्वारद x86 शब्दावली का उपयोग करके) के साथ संरेखण नहीं है।
एड्रेस के [[कम से कम महत्वपूर्ण बिट|निम्न क्रम बिट्स]] को प्रिंट करने से एड्रेस चलता है कि यह शब्द सीमा ( द्वारद x86 शब्दावली का उपयोग करके) के साथ संरेखण नहीं है।


==संदर्भ==
==संदर्भ==

Revision as of 13:15, 28 April 2023

कम्प्यूटिंग में, बस त्रुटि हार्डवेयर द्वारा स्थापित किया गया ट्रैप (कंप्यूटिंग) है, ऑपरेटिंग सिस्टम (ओएस) को सूचित करता है कि प्रक्रिया स्मृति तक पहुँचने की कोशिश कर रही है जिसे सेंट्रल प्रोसेसिंग यूनिट भौतिक रूप से संबोधित नहीं कर सकती है: एड्रेस बस के लिए अमान्य एड्रेस है। अधिकांश आर्किटेक्चर पर आधुनिक उपयोग में ये सेगमेंटेशन दोषों की तुलना में बहुत दुर्लभ हैं, जो मुख्य रूप से मेमोरी एक्सेस उल्लंघनों के कारण होते हैं: तार्किक एड्रेस या अनुमतियां में समस्याएं है।

पॉज़िक्स-अनुपालन प्लेटफॉर्म पर, बस त्रुटियों का परिणाम सामान्यतः सिगबस सिग्नल को प्रक्रिया में भेजा जा रहा है जो त्रुटि का कारण बनता है। सिगबस किसी भी सामान्य उपकरण दोष के कारण भी हो सकता है जिसका कंप्यूटर एड्रेस लगाता है, बस त्रुटि का संभवतः ही कभी तात्पर्य होता है कि कंप्यूटर हार्डवेयर भौतिक रूप से टूटा हुआ है - यह सामान्यतः सॉफ्टवेयर में बग के कारण होता है।[citation needed] कुछ अन्य पेजिंग त्रुटियों के लिए बस त्रुटियां भी उठाई जा सकती हैं; नीचे देखें।

कारण

बस त्रुटियों के तीन मुख्य कारण हैं:

गैर-मौजूद एड्रेस

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

असंरेखित पहुंच

अधिकांश सीपीयू बाइट-एड्रेसेबल होते हैं, जहां प्रत्येक अद्वितीय मेमोरी एड्रेस 8-बिट बाइट को संदर्भित करता है। अधिकांश सीपीयू प्रत्येक मेमोरी एड्रेस से भिन्न-भिन्न बाइट्स तक पहुंच सकते हैं, लेकिन वे सामान्यतः बड़ी इकाइयों (16 बिट्स, 32 बिट्स, 64 बिट्स) तक नहीं पहुंच सकते हैं, इन इकाइयों को विशिष्ट सीमा के लिए डेटा संरचना संरेखण किया जा सकता है (x86 उल्लेखनीय अपवाद है) .

उदाहरण के लिए, यदि बहु-बाइट एक्सेस 16 बिट-संरेखित होना चाहिए, तो 0, 2, 4, 6, और एड्रेस (बाइट्स में दिए गए) संरेखित माने जाएंगे और इसलिए पहुंच योग्य होंगे, जबकि एड्रेस 1, 3, 5, और असंरेखित माना जाएगा। यदि मल्टी-बाइट एक्सेस 32-बिट संरेखित होना चाहिए, तो 0, 4, 8, 12, और इसी प्रकार के एड्रेस को संरेखित माना जाएगा और इसलिए पहुंच योग्य होगा, और मध्य के सभी एड्रेस को असंरेखित माना जाएगा। असंरेखित एड्रेस पर बाइट से बड़ी इकाई तक पहुँचने का प्रयास करने से बस त्रुटि हो सकती है।

उपयोग की जा रही वास्तुकला के आधार पर कुछ प्रणालियों में इनका संकर हो सकता है। उदाहरण के लिए, आईबीएम सिस्टम/360 मेनफ्रेम पर आधारित हार्डवेयर के लिए, जिसमें आईबीएम सिस्टम, विश्वासघाती B8000, आरसीए स्पेक्ट्रा, और यूनीवैक सीरीज 90 सम्मिलित हैं, निर्देश 16-बिट सीमा पर होने चाहिए, निष्पादन एड्रेस पर प्रारंभ होने चाहिए। विषम एड्रेस पर शाखा लगाने का प्रयास विनिर्देशन अपवाद का परिणाम है।[1] डेटा, स्मृति में किसी भी एड्रेस से पुनर्प्राप्त किया जा सकता है, और निर्देश के आधार पर बाइट या उससे अधिक हो सकता है।

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

पेजिंग त्रुटियाँ

FreeBSD, लिनक्स और सोलारिस (ऑपरेटिंग सिस्टम) बस त्रुटि का संकेत दे सकते हैं जब वर्चुअल मेमोरी पेज पेजिंग नहीं कर सकते हैं, उदा। क्योंकि यह लुप्त हो गया है (उदाहरण के लिए मेमोरी-मैप की गई फ़ाइल तक पहुँचना या निष्पादन योग्य को निष्पादित करना जो प्रोग्राम के चलने के समय छोटा कर दिया गया है),[2][unreliable source?] क्योंकि अभी-अभी बनाई गई मेमोरी-मैप की गई फ़ाइल को भौतिक रूप से आवंटित नहीं किया जा सकता है, क्योंकि डिस्क भरी हुई है।


गैर-वर्तमान खंड (x86)

X86 पर प्राचीन स्मृति प्रबंधन तंत्र उपस्थित है जिसे विभाजन के रूप में जाना जाता है। यदि अनुप्रयोग गैर-उपस्थित खंड के चयनकर्ता के साथ सेगमेंट रजिस्टर भार करता है (जो पॉज़िक्स -अनुरूप ओएस के अंतर्गत एकमात्र असेंबली भाषा के साथ किया जा सकता है), अपवाद उत्पन्न होता है। कुछ ओएसई ने परिवर्तन के लिए इसका उपयोग किया, लेकिन नीचे लिनक्स यह सिगबस उत्पन्न करता है।

उदाहरण

यह एटी एंड टी असेंबली सिंटैक्स के साथ सी (प्रोग्रामिंग भाषा) में लिखे गए असंरेखित मेमोरी एक्सेस का उदाहरण है।

#include <stdlib.h>

int main(int argc, char **argv) 
{
    int *iptr;
    char *cptr;
    
#if defined(__GNUC__)
# if defined(__i386__)
    /* Enable Alignment Checking on x86 */
    __asm__("pushf\norl $0x40000,(%esp)\npopf");
# elif defined(__x86_64__) 
     /* Enable Alignment Checking on x86_64 */
    __asm__("pushf\norl $0x40000,(%rsp)\npopf");
# endif
#endif

    /* malloc() always provides memory which is aligned for all fundamental types */
    cptr = malloc(sizeof(int) + 1);
    
    /* Increment the pointer by one, making it misaligned */
    iptr = (int *) ++cptr;

    /* Dereference it as an int pointer, causing an unaligned access */
    *iptr = 42;

    /*
       Following accesses will also result in sigbus error.
       short *sptr;
       int    i;

       sptr = (short *)&i;
       // For all odd value increments, it will result in sigbus.
       sptr = (short *)(((char *)sptr) + 1);
       *sptr = 100;
    
    */

    return 0;
}

पॉज़िक्स संगत ओएस पर x86 पर उदाहरण को संकलित करना और चलाना त्रुटि प्रदर्शित करता है:

$ gcc -ansi sigbus.c -o sigbus
$ ./sigbus 
Bus error
$ gdb ./sigbus
(gdb) r
Program received signal SIGBUS, Bus error.
0x080483ba in main ()
(gdb) x/i $pc
0x80483ba <main+54>:    mov    DWORD PTR [eax],0x2a
(gdb) p/x $eax
$1 = 0x804a009
(gdb) p/t $eax & (sizeof(int) - 1)
$2 = 1

जीडीबी डीबगर दिखाता है कि निरंतर (प्रोग्रामिंग) 0x2a को X86 असेंबली भाषा का उपयोग करके IA-32 रजिस्टर में संग्रहीत स्थान पर संग्रहीत किया जा रहा है। यह रजिस्टर इनडायरेक्ट एड्रेसिंग का उदाहरण है।

एड्रेस के निम्न क्रम बिट्स को प्रिंट करने से एड्रेस चलता है कि यह शब्द सीमा ( द्वारद x86 शब्दावली का उपयोग करके) के साथ संरेखण नहीं है।

संदर्भ

  1. z/Architecture Principles of Operation, SA22-7832-04, Page 6-6, Fifth Edition (September, 2005) IBM Corporation, Poukeepsie, NY, Retrievable from http://publibfp.dhe.ibm.com/epubs/pdf/a2278324.pdf (Retrieved December 31, 2015)
  2. "What is SIGBUS - Object specific hardware error?".