बस त्रुटि (बस एरर)
This article needs additional citations for verification. (July 2015) (Learn how and when to remove this template message) |
कम्प्यूटिंग में, एक बस त्रुटि हार्डवेयर द्वारा उठाया गया एक ट्रैप (कंप्यूटिंग) है, एक ऑपरेटिंग सिस्टम (OS) को सूचित करता है कि एक प्रक्रिया कंप्यूटर डेटा भंडारण तक पहुँचने की कोशिश कर रही है जिसे सेंट्रल प्रोसेसिंग यूनिट भौतिक रूप से संबोधित नहीं कर सकती है: पता बस के लिए एक अमान्य पता, इसके कारण नाम। अधिकांश आर्किटेक्चर पर आधुनिक उपयोग में ये सेगमेंटेशन दोषों की तुलना में बहुत दुर्लभ हैं, जो मुख्य रूप से मेमोरी एक्सेस उल्लंघनों के कारण होते हैं: लॉजिकल एड्रेस में समस्याएं|तार्किक पता या अनुमतियां।
पॉज़िक्स-अनुपालन प्लेटफॉर्म पर, बस त्रुटियों का परिणाम आमतौर पर सिगबस सिग्नल को प्रक्रिया में भेजा जा रहा है जो त्रुटि का कारण बनता है। SIGBUS किसी भी सामान्य उपकरण दोष के कारण भी हो सकता है जिसका कंप्यूटर पता लगाता है, हालांकि बस त्रुटि का शायद ही कभी मतलब होता है कि कंप्यूटर हार्डवेयर भौतिक रूप से टूटा हुआ है - यह आमतौर पर कंप्यूटर प्रोग्राम में सॉफ्टवेयर बग के कारण होता है।[citation needed] कुछ अन्य पेजिंग त्रुटियों के लिए भी बस त्रुटियाँ उठाई जा सकती हैं; नीचे देखें।
कारण
बस त्रुटियों के कम से कम तीन मुख्य कारण हैं:
गैर-मौजूद पता
सॉफ्टवेयर सीपीयू को एक विशिष्ट भौतिक स्मृति पता को पढ़ने या लिखने का निर्देश देता है। तदनुसार, सीपीयू इस भौतिक पते को अपनी पता बस पर सेट करता है और सीपीयू से जुड़े अन्य सभी हार्डवेयर को परिणामों के साथ प्रतिक्रिया देने का अनुरोध करता है, यदि वे इस विशिष्ट पते के लिए उत्तर देते हैं। यदि कोई अन्य हार्डवेयर प्रतिक्रिया नहीं करता है, तो सीपीयू यह बताते हुए एक अपवाद प्रबंधन करता है कि अनुरोधित भौतिक पता पूरे कंप्यूटर सिस्टम द्वारा पहचाना नहीं गया है। ध्यान दें कि यह केवल भौतिक मेमोरी पतों को कवर करता है। एक अपरिभाषित आभासी मेमोरी एड्रेस तक पहुँचने की कोशिश को आम तौर पर एक बस त्रुटि के बजाय एक विभाजन दोष माना जाता है, हालाँकि यदि मेमोरी प्रबंधन इकाई अलग है, तो प्रोसेसर अंतर नहीं बता सकता है।
असंरेखित पहुंच
अधिकांश सीपीयू बाइट-एड्रेसेबल होते हैं, जहां प्रत्येक अद्वितीय मेमोरी एड्रेस 8-बिट बाइट को संदर्भित करता है। अधिकांश सीपीयू प्रत्येक मेमोरी पते से अलग-अलग बाइट्स तक पहुंच सकते हैं, लेकिन वे आम तौर पर बड़ी इकाइयों (16 बिट्स, 32 बिट्स, 64 बिट्स और इसी तरह) तक नहीं पहुंच सकते हैं, इन इकाइयों के बिना एक विशिष्ट सीमा के लिए डेटा संरचना संरेखण (x86 एक उल्लेखनीय अपवाद है) .
उदाहरण के लिए, यदि बहु-बाइट एक्सेस 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-बिट सीमा पर होने चाहिए, यानी, निष्पादन पते एक पर शुरू होने चाहिए यहां तक कि बाइट। एक विषम पते पर शाखा लगाने का प्रयास एक विनिर्देशन अपवाद का परिणाम है।[1] डेटा, हालांकि, स्मृति में किसी भी पते से पुनर्प्राप्त किया जा सकता है, और निर्देश के आधार पर एक बाइट या उससे अधिक हो सकता है।
सीपीयू आम तौर पर हर समय अपने बस (कंप्यूटिंग) की पूरी चौड़ाई में डेटा का उपयोग करते हैं। बाइट्स को संबोधित करने के लिए, वे अपने डेटा बस की पूरी चौड़ाई में मेमोरी एक्सेस करते हैं, फिर अलग-अलग बाइट को संबोधित करने के लिए मास्क और शिफ्ट करते हैं। सिस्टम इस अकुशल एल्गोरिथम को सहन करते हैं, क्योंकि यह अधिकांश सॉफ़्टवेयर, विशेष रूप से स्ट्रिंग (कंप्यूटर विज्ञान) प्रसंस्करण के लिए एक आवश्यक विशेषता है। बाइट्स के विपरीत, बड़ी इकाइयाँ दो संरेखित पतों को फैला सकती हैं और इस प्रकार डेटा बस में एक से अधिक लाने की आवश्यकता होगी। सीपीयू के लिए इसका समर्थन करना संभव है, लेकिन मशीन कोड स्तर पर इस कार्यक्षमता की शायद ही कभी आवश्यकता होती है, इस प्रकार सीपीयू डिजाइनर आमतौर पर इसे लागू करने से बचते हैं और इसके बजाय असंरेखित मेमोरी एक्सेस के लिए बस त्रुटियां जारी करते हैं।
पेजिंग त्रुटियाँ
FreeBSD, Linux और Solaris (ऑपरेटिंग सिस्टम) एक बस त्रुटि का संकेत दे सकते हैं जब वर्चुअल मेमोरी पेज पेजिंग नहीं कर सकते हैं, उदा। क्योंकि यह गायब हो गया है (उदाहरण के लिए मेमोरी-मैप की गई फ़ाइल तक पहुँचना या एक निष्पादन योग्य को निष्पादित करना जो प्रोग्राम के चलने के दौरान छोटा कर दिया गया है),[2][unreliable source?] या क्योंकि अभी-अभी बनाई गई मेमोरी-मैप की गई फ़ाइल को भौतिक रूप से आवंटित नहीं किया जा सकता है, क्योंकि डिस्क भरी हुई है।
गैर-वर्तमान खंड (x86)
X86 पर एक पुराना स्मृति प्रबंधन मौजूद है तंत्र जिसे X86 मेमोरी सेगमेंटेशन के रूप में जाना जाता है। यदि एप्लिकेशन चयनकर्ता के साथ सेगमेंट रजिस्टर लोड करता है गैर-मौजूदा खंड (जो POSIX-अनुपालन OSes के तहत केवल असेंबली भाषा के साथ किया जा सकता है), अपवाद उत्पन्न होता है। कुछ ओएसई ने स्वैपिंग के लिए इसका इस्तेमाल किया, लेकिन नीचे लिनक्स यह सिगबस उत्पन्न करता है।
उदाहरण
यह एटी एंड टी सिंटैक्स | एटी एंड टी असेंबली सिंटैक्स के साथ सी (प्रोग्रामिंग भाषा) में लिखे गए असंरेखित मेमोरी एक्सेस का एक उदाहरण है।
#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;
}
POSIX संगत OS पर 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
GDB डिबगर दिखाता है कि निरंतर (प्रोग्रामिंग) 0x2a को IA-32 प्रोसेसर रजिस्टर में संग्रहीत स्थान पर X86 असेंबली भाषा का उपयोग करके संग्रहीत किया जा रहा है। यह एड्रेसिंग मोड# रजिस्टर इनडायरेक्ट एड्रेसिंग का एक उदाहरण है।
पते के कम से कम महत्वपूर्ण बिट को प्रिंट करने से पता चलता है कि यह डेटा संरचना संरेखण नहीं है (x86 शब्दावली का उपयोग करते हुए dword)।
संदर्भ
- ↑ 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)
- ↑ "What is SIGBUS - Object specific hardware error?".