2017-01-04 4 views
6

कारण है कि Starman seems to believe the GRUB Legacy author's explanation (निम्नलिखित भरी कोड के लिए देखें:07C0: 0000 नहीं है, x86 मशीनों पर 0000: 7C00 के समान भौतिक पता? मेरे सवाल के लिए

7C4B EA507C0000 JMP  0000:7C50 ; Long Jump to the next instruction 
             ; because some bogus BIOSes jump to 
             ; 07C0:0000 instead of 0000:7C00. 

जब मैं पहली बार स्मृति संदर्भ पर प्रभावी पतों के निर्माण के लिए इंटेल द्वारा निर्दिष्ट एल्गोरिथ्म करते हैं, मैं 07C0 गुणा करते हैं: (प्रभावी रूप से 16 से इसे चार बिट्स या एक आधा बाइट स्थानांतरित कर दिया गया है)। फिर मैं 0000 का ऑफ़सेट जोड़ता हूं और दशमलव पता 31,744 प्राप्त करता हूं।

यदि मैंने दूसरी मेमोरी संदर्भ चार बिट्स के सेगमेंट को स्थानांतरित किया है तो मेरे पास अभी भी 0000 है: और ऑफसेट: 7 सी 00 अभी भी 31,744 स्थान को संबोधित करता है। इसलिए मेरी आंत प्रतिक्रिया इस GRUB विरासत बूट सेक्टर कोड का लेखक है जो हमारे पैर खींच रही है। Regardl किसी भी BIOS द्वारा किए गए मेमोरी संदर्भ के रूप में निबंध, यदि प्रभावी पता दशमलव 31,744 की गणना करता है, तो ऐसा लगता है कि इस लंबी कूद को हल करने में कोई समस्या नहीं है।

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

यदि BIOS सही स्थान (7C00) पर कूदता है, तो कोई समस्या नहीं है। यदि BIOS 7C00 से ऊपर किसी स्थान पर कूदता है, तो 7C00 पर लोड कोई कोड उस समस्या को ठीक नहीं कर सकता है। यदि BIOS 7C00 और 7C4B के बीच किसी स्थान पर कूदता है, तो उस क्षेत्र में संग्रहीत डेटा (या उनसे लापता बाइट्स के साथ व्याख्या किए जाने वाले इंस्टॉलेशन) की संभावना क्रैश हो सकती है। यदि बीआईओएस बिल्कुल 7 सी 4 बी तक कूद जाए, तो टेस्ट निर्देश बीओओएस में किए गए अंतिम गणित के आधार पर ओवर-लिखित (लांग जंप द्वारा) और जेएनजेड से 7 सी 54 को निष्पादित किया जाएगा।

बीआईओएस के लिए 7 सी 4 बी नीचे कूदता है, फिर गलत ग़लत निर्देशों के कारण दुर्घटना हो सकती है। शुभकामना के साथ, बूट सेक्टर कोड के कुछ हिस्से को निष्पादित किया जाएगा। इस तरह के निष्पादन के परिणाम बीओओएस पर कूदने के लिए "बोगस" मेमोरी एड्रेस पर निर्भर करेगा। तो इस बूट सेक्टर कोड का लेखक हमारे पैर को "फर्जी बीओओएस के गलत स्थान पर कूदने" के बारे में एक कहानी के साथ खींच रहा है?

मैं ल्यूक लुओ के ब्लॉग में नोट करता हूं कि GRUB2 बूट सेक्टर, हालांकि GRUB विरासत बूट सेक्टर, retains this inexplicable Long Jump से अलग है। तो यदि GRUB लीगेसी बूट सेक्टर का मूल लेखक हमारे ऊपर एक मजाक खेल रहा था, तो यह एक बहुत ही सफल मजाक है (यह GRUB का एक पूर्ण पुनः लिख गया है)। मुझे कुछ गैर-नामित BIOS के बारे में अविश्वसनीय दावा करने और इस तरह की समस्या का हल करने की पसंद के साथ छोड़ दिया गया है जो वास्तव में कुछ भी नहीं करता है या यह मानते हुए कि मूल बूट क्षेत्र का लेखक हमारे ऊपर एक मजाक उड़ा रहा था।

ल्यूक लुओ 7C66 और 7C67 को एनओपी निर्देशों के लेखन को स्वीकार करने के लिए प्रतीत होता है, इस सबूत के रूप में कि उसके पास कोई BIOS नहीं है जो गलत स्थान पर कूदता है। जीएनयूबी बूट क्षेत्र जो कि लिनक्स मिंट 13 द्वारा मेरी फ्लैश ड्राइव पर लिखा गया था, में इन समान एनओपी हैं। हालांकि मेरे लैपटॉप की हार्ड ड्राइव (डेबियन एच्च द्वारा) में लिखा गया GRUB2 बूट सेक्टर 7C66 और 7C67 पर लिखे गए अगले निर्देश पर एक छोटी सी कूद है (ध्यान दें कि ल्यूक लुओ हमें दिखाता है कि मूल बूट क्षेत्र/usr/lib/grub/i386-पीसी/boot.img डेबियन मान है)। दोनों विकल्पों का एक ही प्रभाव होता है (उनके अनुसरण में दिए गए निर्देश को निष्पादित करें), इसलिए बूट क्षेत्र दोनों काम करते हैं। बूट क्षेत्र में ऐसी दक्षता भी नहीं है जहां कोड के लिए केवल 450 बाइट उपलब्ध हों, जो किसी अन्य क्षेत्र को लोड करना होगा और इसे निष्पादित करना होगा (उस सरल ऑपरेशन के साथ कुछ गलत होने पर त्रुटि संदेशों सहित और आठ-बाइट पते खुद ही क्षेत्र)।

तो क्या मुझे कुछ याद आ रहा है, या क्या मैंने एक क्लज की पहचान की है जिसे GRUB बूट सेक्टर (अधिक सार्थक कोड के लिए जगह बनाने के लिए) से हटाया जाना चाहिए?

+2

कुछ समय पहले मैं एक स्थिति है जहाँ के बारे में [Stackoverflow क्यू एंड ए] (http://stackoverflow.com/questions/34548325/near-call-jump-tables-dont-always-work-in-a-bootloader) ने लिखा है उस दूर की कूद नहीं होने से बूटलोडर में गलत परिणाम मिल सकते हैं। यह वास्तव में इस बात पर निर्भर करता है कि बूटलोडर कोड कैसे लिखा जाता है। सावधानी बरतने वाले कुछ बूटलोडर डेवलपर्स एफएआर जेएमपी को स्पष्ट रूप से _CS_ को उनके इच्छित मान पर सेट करने के लिए जोड़ते हैं ताकि वे समस्याओं में भाग न सकें, लेकिन यह आवश्यक नहीं हो सकता है कि उनका कोड कभी भी _CS_ –

+0

में किसी विशेष मान पर निर्भर न हो सोचें "सावधानी बरतने" इसमें शामिल हैं। इस समस्या के साथ BIOS की और पहचान के बिना कोई यह भी सत्यापित नहीं कर सकता कि यह अभी भी मौजूद है। उन दिनों में जब हमारे पास हमारे हार्डवेयर के साथ हमारे BIOS प्राप्त करने के अलावा कोई विकल्प नहीं था, तो यह एक BIOS विक्रेता का समाधान होगा जो कोड को कैसे नहीं जानता है। आज मुझे उम्मीद है कि समाधान BIOS को प्रतिस्थापित करना होगा। –

+1

स्थिति कब बदल गई कि BIOS हार्डवेयर के साथ नहीं आया? पिछले कई सालों में मैंने खरीदा हर मदरबोर्ड एक अंतर्निहित बीआईओएस के साथ आया है। और वर्चुअल मशीनों के साथ भी, वीएम विक्रेता अभी भी BIOS कार्यान्वयन लिखता है। –

उत्तर

6

आप सीपीयू की वास्तविक स्थिति में अंतर खो रहे हैं (जबकि भौतिक पता एक ही है, यह सही है)।

जब BIOS करता JMP 0000:7C00:

अपने पहले निर्देश cs=0000, ip=7C00 पर स्थित है, और जब भी यह संबोधित तरह उदाहरण के लिए mov ax,cs:[myTable] (तब myTable कर सकते हैं किसी भी पूर्ण करता है अपने मशीन कोड, स्थान परिवर्तन के इस प्रकार के लिए संकलित किया जाना है 0x7F00 जैसे कुछ बनें)।

जब BIOS JMP 07C0:0000 करता है:

अपना पहला अनुदेश, cs=07C0, ip=0000 पर स्थित है इसलिए myTable तरह बातें अधिक 0x0300 तरह होगा।

इस प्रकार कोड की शुरुआत में पहली लंबी कूद उसी भौतिक पते को 31,744 "0xरूप में" सामान्य "सामान्यीकृत करेगी, जिससे बूटलोडर कोड में शेष पूर्ण पते सही तरीके से काम करेंगे।

+1

मैंने यही सोचा, लेकिन मुझे असेंबली कोड में कोई सेगमेंट ओवरराइड उपसर्ग नहीं मिला। अगले निर्देश डीएस को [0000] शुरू करते हैं। क्या आपने बताया कि कोड में यह एक फर्क पड़ता है? शायद यह पिछले कोड के बस एक बाएं ओवर है ... – fjardon

+0

@fjardon मैंने विशेष स्रोत की जांच नहीं की, भले ही विशेष बूटलोडर केवल 'डीएस:' और रिश्तेदार कूद के साथ काम करेगा, फिर भी भविष्य में किसी के लिए यह थोड़ा "विषाक्त" जाल है जो इसे संशोधित करने का प्रयास करेगा। तो मैं अभी भी इस अभ्यास को कोड के लिए भी अनुशंसा करता हूं जो 'cs' मान पर भरोसा नहीं करता है। – Ped7g

+0

@fjardon और अब मैंने एक नज़र डाली, और कोई समस्या नहीं मिली। तो ऐसा लगता है कि इस मामले में कूद वास्तव में केवल सावधानी बरतनी है (मैंने केवल ~ 5min देखो, कोई गंभीर कोड समीक्षा नहीं की है)। फिर फिर मुझे यकीन नहीं है कि अतिरिक्त 5 बी * किसी * जोखिम के लायक हैं या नहीं। कुछ विशेष मामले में निश्चित रूप से हाँ, लेकिन आमतौर पर शायद नहीं। – Ped7g

संबंधित मुद्दे