2011-03-06 39 views
24

मुझे समझ में कठिनाई हो रही है कि एक साधारण बूट लोडर कैसे काम करता है। बूट लोडर के बारे में मैं बात कर रहा हूं एमआईटी कोर्स "ऑपरेटिंग सिस्टम इंजीनियरिंग" से एक है।बूटलोडर - संरक्षित मोड में स्विचिंग प्रोसेसर

सबसे पहले, मैं आपको विधानसभा कोड का एक टुकड़ा BIOS कार्यान्वित दिखाते हैं:

[f000:fec3] 0xffec3: lidtw %cs:0x7908 
[f000:fec9] 0xffec9: lgdtw %cs:0x7948 
[f000:fecf] 0xffecf: mov %cr0,%eax 
[f000:fed2] 0xffed2: or  $0x1,%eax 
[f000:fed6] 0xffed6: mov %eax,%cr0 
[f000:fed9] 0xffed9: ljmpl $0x8,$0xffee1 

यह दिखता से, इस कोड को बाधा मेज और वर्णनकर्ता तालिका सेट और फिर सुरक्षित मोड चालू हो जाती है ।

  1. हम BIOS में संरक्षित मोड में क्यों जाते हैं? वास्तविक मोड में नहीं बूटलोडर रन चाहिए (Btw - कारण है कि यह असली मोड में चलाने की आवश्यकता है?)
  2. मैं खोज की, लेकिन कहीं भी नहीं मिला वास्तव में कैसे ljmpl अनुदेश काम करता है, और अंतर है के बीच यह और ljmp और नियमित jmp - I कोई सराहना करेगा अगर कोई सही दिशा में इंगित करेगा।
  3. हम कूद क्यों करते हैं? इस निर्देश का उद्देश्य क्या है?

बूट लोडर कोड के लिए आगे बढ़ते -

# Switch from real to protected mode, using a bootstrap GDT 
# and segment translation that makes virtual addresses 
# identical to their physical addresses, so that the 
# effective memory map does not change during the switch. 
lgdt gdtdesc 
movl %cr0, %eax 
orl  $CR0_PE_ON, %eax 
movl %eax, %cr0 

# Jump to next instruction, but in 32-bit code segment. 
# Switches processor into 32-bit mode. 
ljmp $PROT_MODE_CSEG, $protcseg 
  1. इसमें कहा गया है कि प्रोसेसर वास्तविक मोड में है - लेकिन हम अभी सुरक्षित मोड है कि BIOS स्विच देखा ... मैं उलझन में हूं - यह कैसे हो सकता है?
  2. हम 32 बिट मोड पर कैसे स्विच करते हैं? एलजेएम निर्देश के कारण प्रोसेसर को जादुई रूप से 32 बिट मोड में जाने का कारण बनता है?

और एक और बात यह है कि मुझे समझ नहीं आता - जब मैं gdb साथ बूटलोडर के निष्पादन को ट्रैक मैं देख रहा हूँ निम्नलिखित अनुदेश निष्पादित किया जा रहा है (जो बूटलोडर कोड से LJMP अनुदेश है):

ljmp $0x8,$0x7c32 

लेकिन जब मैं .asm फ़ाइल में देखा मैंने देखा कि निम्नलिखित:

ljmp $0xb866,$0x87c32 

पूरी तरह से यहाँ खो - कैसे अनुदेश .asm फ़ाइल में लिखा आओ और अनुदेश निष्पादित अलग हैं? मेरे पास एक छिद्र है जिसे इसे संरक्षित मोड से करना है और यह पते का अनुवाद कैसे करता है लेकिन मुझे वास्तव में यह नहीं मिलता है।

मैं किसी भी मदद की सराहना करता हूं!

+0

बहुत व्यापक रूप से बंद करने के लिए वोटिंग: एक में बहुत से प्रश्न। –

उत्तर

24
  1. कुछ BIOS कार्यान्वयन बूटलोडर में प्रवेश करने से पहले संरक्षित मोड में जाते हैं। अधिकांश नहीं करते हैं। यह संभव है कि BIOS एक छोटी अवधि के लिए संरक्षित मोड में स्विच हो और बूटलोडर पर जाने से पहले वापस स्विच हो, जो इसे संरक्षित मोड के कुछ लाभों (जैसे कि 32 बिट डिफ़ॉल्ट पता आकार) का उपयोग करने की अनुमति देगा। बूटलोडर वास्तविक मोड में होना चाहिए कि अधिकांश BIOS फ़ंक्शन केवल वास्तविक मोड में काम करते हैं, इसलिए आपको उनका उपयोग करने के लिए वास्तविक मोड में होना चाहिए।

  2. ljmp पते पर जोड़ने के लिए स्विच करने के लिए एक कोड सेगमेंट निर्दिष्ट करता है। वे इतने समान हैं कि (कम से कम जीएएस में) असेंबलर आपके लिए 2 ऑपरेंड के साथ एक जेएमपी स्विच करेगा।

  3. ljmp सीएस रजिस्टर को बदलने का एकमात्र तरीका है। संरक्षित मोड को सक्रिय करने के लिए इसे करने की आवश्यकता है, क्योंकि सीएस रजिस्टर को जीडीटी में कोड सेगमेंट के लिए चयनकर्ता रखने की आवश्यकता है। (यदि आप जानना चाहते हैं, तो सीएस बदलने के अन्य तरीके बहुत दूर हैं, दूर लौटते हैं, और वापसी में बाधा डालते हैं)

  4. आइटम देखें 1. या तो BIOS वास्तविक मोड पर वापस स्विच हो गया है, या यह बूटलोडर इस के साथ काम नहीं करेगा BIOS।

  5. आइटम 3 देखें। यह 32 बिट कोड सेगमेंट निर्दिष्ट करने के लिए सीएस को बदलता है, इसलिए प्रोसेसर 32 बिट मोड में जाता है।

  6. जब आप .asm फ़ाइल को देखते थे, तो निर्देश का पता लगाया गया था कि पता आकार 32 बिट था, लेकिन जीडीबी ने इसका दुरुपयोग किया जैसे पता आकार 16 बिट था। निर्देश के पते पर डेटा 0xEA 32 7C 08 00 66 बी 8 होगा। ईए लंबी कूद ओपोड है। 32 बिट एड्रेस स्पेस में, पते को 0x87C32 के पते के लिए अगले चार बाइट्स का उपयोग करके निर्दिष्ट किया जाएगा, लेकिन 16 बिट एड्रेस स्पेस में, 0x7C32 के पते के लिए केवल 2 बाइट्स का उपयोग किया जाता है। पते के बाद 2 बाइट अनुरोधित कोड सेगमेंट निर्दिष्ट करते हैं, जो 32 बिट मोड में 0xB866 और 16 बिट मोड में 0x0008 होगा। 0x66 बी 8 अगले निर्देश की शुरुआत है, जो कुल्हाड़ी रजिस्टर में 16 बिट तत्काल मूल्य को स्थानांतरित कर रहा है, शायद संरक्षित मोड के लिए डेटा सेगमेंट सेट अप करने के लिए।

+3

बहुत बढ़िया - आपने वास्तव में मेरे लिए चीजों को स्पष्ट किया, धन्यवाद! – s0li

2

हम BIOS में संरक्षित मोड में क्यों जाते हैं? बूटलोडर को वास्तविक मोड में नहीं चलाना चाहिए (बीटीडब्ल्यू - इसे वास्तविक मोड में चलाने की आवश्यकता क्यों है?)

संरक्षित मोड बस रीयलमोड की तुलना में बहुत अधिक सुविधा प्रदान करता है: अनिवार्य रूप से इंटेल सीपीयू की सुरक्षा रिंग विशेषाधिकार तंत्र (http: // en.wikipedia.org/wiki/Ring_(computer_security), 32-बिट मोड निष्पादन इत्यादि

मैंने खोज की लेकिन मुझे कहीं भी नहीं मिला कि ljmpl निर्देश कैसे काम करता है, और यह और ljmp और नियमित jmp के बीच का अंतर है - मैं अगर किसी को सही दिशा में बात करेंगे की सराहना करेंगे

ljmpl और LJMP प्रासंगिक रूप से यहाँ एक ही है

।। 210

हम कूद क्यों करते हैं? इस निर्देश का उद्देश्य क्या है?

: के रूप में इंटेल के मैनुअल में प्रलेखित है, और नीचे के रूप में अच्छी तरह से दिखाया गया कोड में inlined प्रलेखित

यह आवश्यक है ..

असली करने के लिए संरक्षित संक्रमण के लिए, यह stage2 बूटलोडर यहाँ में कार्यान्वित किया जाता http://src.illumos.org/source/xref/illumos-gate/usr/src/grub/grub-0.97/stage2/asm.S#real_to_prot

974 /* load the GDT register */ 
975 DATA32 ADDR32 lgdt gdtdesc 
976 
977 /* turn on protected mode */ 
978 movl %cr0, %eax 
979 orl $CR0_PE_ON, %eax 
980 movl %eax, %cr0 
981 
982 /* jump to relocation, flush prefetch queue, and reload %cs */ 
983 DATA32 ljmp $PROT_MODE_CSEG, $protcseg 
984 

यू देख सकते हैं, कोड के प्रत्येक भाग के एक समारोह है, और LJMP अनिवार्य है फ्लश करने के लिए ओ इंटेल मैनुअल में आवश्यक प्रीफेच कतार के रूप में, मुझे याद नहीं है।