2014-10-19 8 views
6

मैं बूटलोडर के रूप में isolinux (syslinux 4.5) का उपयोग कर एक ऑपरेटिंग सिस्टम प्रोजेक्ट पर काम कर रहा हूं, 0x200000 पर आयोजित मल्टीबूट हेडर के साथ अपना कर्नेल लोड कर रहा हूं।संरक्षित मोड में BIOS इंटरप्ट्स

जैसा कि मुझे पता है कि कर्नेल पहले ही 32-बिट संरक्षित मोड में है। मेरा सवाल: क्या BIOS इंटरप्ट्स तक पहुंच प्राप्त करने का कोई आसान तरीका है? (मूल रूप से मुझे 0x10 चाहिए: डी)

लोड होने के बाद, मेरा कर्नेल अपनी जीडीटी और आईडीटी प्रविष्टियां सेट करता है और आगे आईआरक्यू को रीमेप्स करता है। तो, क्या कर्नेल लोड होने के बाद वास्तविक मोड में कूदना और वीजीए/एसवीजीए मोड (वीबीई 2.0 मोड) स्थापित करना संभव है। फिर मैं अपने कर्नेल के साथ आगे बढ़ने के बाद और सुरक्षित मोड में कूद जाऊंगा जहां मैं स्क्रीन पर लिखने के लिए वीबीई 2.0 भौतिक बफर पता का उपयोग करता हूं? यदि हां कैसे? मैं एक बहुत कोशिश की, लेकिन सफलता नहीं मिली :(

साइड ध्यान दें:। मैं इंटरनेट पर एक बहुत की खोज की और पाया कि SYSLINUX 1.x +, _intcall एपीआई प्रदान करता है मैं 100% इसके बारे में यकीन नहीं है का संदर्भ लें "SYSLINUX 4.5 \ com32 \ lib \ sys \ initcall.c"

उत्तर

2

संक्षिप्त उत्तर है कोई। BIOS कॉल वास्तविक मोड में संचालित करने के लिए तैयार कर रहे हैं और सुरक्षित मोड द्वारा निर्धारित मजबूरी का सम्मान नहीं करते, तो आप कर रहे हैं यदि आप कोशिश करते हैं तो उन्हें उपयोग करने की अनुमति नहीं है और सीपीयू ट्रिपल-गलती होगी।

हालांकि, x86 प्रोसेसर Virtual 8086 mode प्रदान करते हैं, जिसका उपयोग x86 प्रोसेसो को अनुकरण करने के लिए किया जा सकता है 16-बिट वास्तविक मोड में चल रहा है। ओएसडीव विकी और मंच इस विषय पर जानकारी का भरपूर धन प्रदान करते हैं। यदि आप इस मार्ग पर जाते हैं, तो आमतौर पर कर्नेल को उच्च आधा (लिनक्स 0xC0000000 का उपयोग करता है) को VM86 कोड में हस्तक्षेप से बचने के लिए एक अच्छा विचार है।

2

BIOS को 16-बिट मशीनों के लिए डिज़ाइन किया गया था। हालांकि, अभी भी आपके पास संरक्षित मोड में BIOS इंटरप्ट्स को कॉल करने के लिए तीन विकल्प हैं।

  1. वास्तविक मोड पर वापस स्विच करें और संरक्षित मोड पुनः दर्ज करें (सबसे आसान दृष्टिकोण)।
  2. v86 मोड का उपयोग करें (64-बिट लंबे मोड में उपलब्ध नहीं है)।
  3. अपना खुद का 16-बिट x86 प्रोसेसर एमुलेटर (सबसे कठिन दृष्टिकोण) लिखें।

मैंने बीओओएस के माध्यम से वीबीई और डिस्क एक्सेस के लिए अपने ऑपरेटिंग सिस्टम में पहला दृष्टिकोण इस्तेमाल किया।
कोड मेरे ऑपरेटिंग सिस्टम में इस उद्देश्य के लिए उपयोग किया जाता है:

;______________________________________________________________________________________________________ 
;Switch to 16-bit real Mode 
;IN/OUT: nothing 

go16: 
    [BITS 32] 

    cli   ;Clear interrupts 
    pop edx   ;save return location in edx 

    jmp 0x20:PM16  ;Load CS with selector 0x20 

;For go to 16-bit real mode, first we have to go to 16-bit protected mode 
    [BITS 16] 
PM16: 
    mov ax, 0x28  ;0x28 is 16-bit protected mode selector. 
    mov ss, ax 
    mov ds, ax 
    mov es, ax 
    mov gs, ax 
    mov fs, ax 
    mov sp, 0x7c00+0x200 ;Stack hase base at 0x7c00+0x200  


    mov eax, cr0 
    and eax, 0xfffffffe ;Clear protected enable bit in cr0 

    mov cr0, eax  

    jmp 0x50:realMode ;Load CS and IP 


realMode: 
;Load segment registers with 16-bit Values. 
    mov ax, 0x50 
    mov ds, ax 
    mov fs, ax 
    mov gs, ax 
    mov ax, 0 
    mov ss, ax 
    mov ax, 0 
    mov es, ax 
    mov sp, 0x7c00+0x200  

    cli 
    lidt[.idtR]  ;Load real mode interrupt vector table 
    sti 

    push 0x50  ;New CS 
    push dx   ;New IP (saved in edx) 
    retf   ;Load CS, IP and Start real mode 

;Real mode interrupt vector table 
.idtR: dw 0xffff  ;Limit 
    dd 0   ;Base 
संबंधित मुद्दे