2009-06-27 12 views
12

मुझे पता है कि, बूटिंग पर, BIOS स्मृति 0x7c00 पर प्री-डिफ़ाइंड डिवाइस ड्राइव के पहले सेक्टर (512 बाइट्स) लोड करता है और फिर उस पते पर कूदता है।बीआईओएस रैम में क्या जानकारी लोड करता है?

तो, 0x7c00 से 0x7dff की स्मृति पर कब्जा कर लिया गया है। क्या रैम का कोई अन्य वर्ग है जो कब्जा कर लिया गया है?

यदि मैं एक ऑपरेटिंग सिस्टम प्रोग्रामिंग कर रहा हूं, तो क्या मैं अपने सभी उद्देश्यों के लिए 0x7c00 से ox7dff को छोड़कर सभी रैम का उपयोग कर सकता हूं ?, या बूट समय पर "बहुमूल्य" जानकारी से भरा कोई अन्य अनुभाग है जिसे मुझे ओवरराइट नहीं करना चाहिए ?

मुझे पता है कि किसी दिए गए पल में, मैं स्मृति (चेनलोडिंग) पर लोड एमबीआर को ओवरराइट कर सकता हूं, मेरा प्रश्न इस पर केंद्रित है ... ऑपरेटिंग सिस्टम के लिए मेमोरी का कौन सा हिस्सा उपलब्ध है?

मेरे खराब अंग्रेजी के लिए खेद है। आपके उत्तरों के लिए धन्यवाद !!

उत्तर

0

यदि आप ओएस लिखते हैं, जैसे ही आप सुरक्षित मोड में जाते हैं, तो आप BIOS को भूल जाते हैं (जब तक कि आप कुछ खराब डिवाइस के साथ काम नहीं कर रहे हों) और आपके पास सभी का उपयोग करें।

या क्या आप बूटलोडर लिख रहे हैं?

+0

आप BIOS को नहीं भूल सकते हैं। इसे एमएमआईओ क्षेत्रों के लिए सुरक्षित स्मृति के कुछ क्षेत्रों की आवश्यकता हो सकती है, या एसएमएम कोड द्वारा उपयोग के लिए। – bdonlan

+0

बहुत सारे भौतिक स्मृति क्षेत्र हैं जो विशेष रूप से मेमोरी मैप किए गए हार्डवेयर के साथ प्रयोग योग्य नहीं हैं। – clemahieu

7

किसी भी दूर से हाल ही में BIOS के साथ, आप BIOS Int 15/AX=E820h call का उपयोग करके स्मृति नक्शा जानकारी प्राप्त कर सकते हैं। यह आपको बताएगा कि आप अपने ओएस के लिए किस स्मृति का उपयोग कर सकते हैं।

detect available memory पर एक और विस्तृत स्पष्टीकरण, और BIOS memory map की सामग्री OSDev पर मिल सकती है।

8

86 रियल मोड मेमोरी मानचित्र इस प्रकार है:

- 0x00000000 - 0x000003FF - Real Mode Interrupt Vector Table 
- 0x00000400 - 0x000004FF - BIOS Data Area 
- 0x00000500 - 0x00007BFF - Unused 
- 0x00007C00 - 0x00007DFF - Our Bootloader 
- 0x00007E00 - 0x0009FFFF - Unused 
- 0x000A0000 - 0x000BFFFF - Video RAM (VRAM) Memory 
- 0x000B0000 - 0x000B7777 - Monochrome Video Memory 
- 0x000B8000 - 0x000BFFFF - Color Video Memory 
- 0x000C0000 - 0x000C7FFF - Video ROM BIOS 
- 0x000C8000 - 0x000EFFFF - BIOS Shadow Area 
- 0x000F0000 - 0x000FFFFF - System BIOS 

मेरा असली मोड प्रोग्रामिंग में मैं आमतौर पर से 0x00007E00 छड़ी - 0x0009FFFF (नहीं इसके बारे में सब) .. मैं का उपयोग खंड: ऑफसेट का उपयोग करने को संबोधित स्मृति .. एक 1 स्टेज बूटलोडर से एक कर्नेल या एक बूटलोडर 2 चरण के लिए जाने के लिए, मैं का उपयोग करें:

; bootloader.s 

BITS 16 
ORG 0x7C00 

    CLI 
    JMP 0xE000  ; Can also be JMP 0x7C00:200 
    HLT 

TIMES 510 - ($-$$) DB 0 
DW 0xAA55 

-

; Something.s 

BITS 16 
ORG 0x7E00  ; Can also be ORG 0x7C00:200 

; Code goes here for your purposes.. whether it be a 2nd stage 
; bootloader or your 16bit kernel.. 

CLI 
HLT 

यदि आप संरक्षित मोड में जा रहे हैं, तो आपको अभी भी ऊपर दिखाए गए स्टब की आवश्यकता होगी .. Something.s में आप अपने संरक्षित मोड रूटीन (जीडीटी, ए 20, सेट वीडियो मोड इत्यादि) में प्रोग्राम कर सकते हैं।

0x7C00 (बूटलोडर एंट्री प्वाइंट) पर मेमोरी लोकेशन के बारे में बताने के लिए, 0x7C00 - 0x7DFF वह जगह है जहां आप अपना बूटलोडर (ऊपर बूटलोडर.s) डालते हैं। आप इसे वहां रखते हैं क्योंकि बीआईओएस अपने दिनचर्या के बाद उस स्थान पर कूदता है। बूटलोडर आकार में बिल्कुल 512 बाइट होना चाहिए (TIMES निर्देश देखें)। वहां से, आपका कोड कोई भी आकार हो सकता है (जब तक यह मेमोरी मैप में फिट बैठता है), और आप ओएस पर पूरी तरह से काम करने में सक्षम होंगे।

यदि आप 32 बिट संरक्षित मोड में जाते हैं, तो आप 1 एमआईबी चिह्न के बारे में कुछ भी उपयोग करने में सक्षम होंगे।

+0

मैंने पोस्ट करने के बाद तक तारीख को नोटिस नहीं किया .. इसे वापस लाने के लिए खेद है। –

+1

"- 0x00007E00 - 0x0009FFFF - अप्रयुक्त" - यह पूरी तरह से सच नहीं है। रेंज जो निःशुल्क होने की गारंटी है 0x00007E00 - 0x0007FFFF है।उस सीमा के ऊपर आपके पास ईबीडीए (आमतौर पर 0x0009FC00 - \t 0x0009FFFF पर होगा, लेकिन मैंने इसे 0x00096C00 और अन्य स्थानों पर भी देखा है) और संभावित रूप से कुछ BIOS कोड। कुछ बीओओएस में इस श्रेणी में पीएक्सई बूट कोड है। एक रूढ़िवादी दृष्टिकोण 0x00080000 से ऊपर सबकुछ से बचने के लिए है। – Timo

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