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

From Vigyanwiki
Line 101: Line 101:
[[Category: Machine Translated Page]]
[[Category: Machine Translated Page]]
[[Category:Created On 26/04/2023]]
[[Category:Created On 26/04/2023]]
[[Category:Vigyan Ready]]

Revision as of 08:08, 16 May 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?".