2010-03-28 15 views
5

के साथ त्रुटि हम कर्नेल को लिखने और इंस और आउट सीखने के लिए एक प्रोजेक्ट पर काम कर रहे हैं। हमारे पास बूटस्ट्रैप लोडर लिखा गया है और यह काम करता प्रतीत होता है। हालांकि हमें कर्नेल लोडिंग में कोई समस्या है। यह इजाफा होगा और गला घोंटना करने के लिए पैदा करने के बिनाबूटस्ट्रैप लोडर और कर्नेल

[BITS 16] 
    [ORG 0x0000] 
; 
; all the stuff in between 
; 
; the bottom of the bootstrap loader 

    datasector dw 0x0000 
    cluster  dw 0x0000 
    ImageName db "KERNEL SYS" 
    msgLoading db 0x0D, 0x0A, "Loading Kernel Shell", 0x0D, 0x0A, 0x00 
    msgCRLF  db 0x0D, 0x0A, 0x00 
    msgProgress db ".", 0x00 
    msgFailure db 0x0D, 0x0A, "ERROR : Press key to reboot", 0x00 

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

    ;************************************************************************* 

bootloader.asm संपादक के लिए बहुत लंबा है: मैं पहले भाग के साथ शुरू करेंगे:

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

kernel.asm:

[BITS 16] 
[ORG 0x0000] 

[SEGMENT .text]   ; code segment 
    mov  ax, 0x0100   ; location where kernel is loaded 
    mov  ds, ax 
    mov  es, ax 

    cli 
    mov  ss, ax   ; stack segment 
    mov  sp, 0xFFFF   ; stack pointer at 64k limit 
    sti 

    mov  si, strWelcomeMsg  ; load message 
    call  _disp_str 

    mov  ah, 0x00 
    int  0x16    ; interrupt: await keypress 
    int  0x19    ; interrupt: reboot 

_disp_str: 
    lodsb      ; load next character 
    or  al, al   ; test for NUL character 
    jz  .DONE 

    mov  ah, 0x0E   ; BIOS teletype 
    mov  bh, 0x00   ; display page 0 
    mov  bl, 0x07   ; text attribute 
    int  0x10    ; interrupt: invoke BIOS 

    jmp  _disp_str 

.DONE: 
    ret 

[SEGMENT .data]     ; initialized data segment 
    strWelcomeMsg db "Welcome to our OS", 0x00 

[SEGMENT .bss]    ; uninitialized data segment 

एनएएसएम 2.06rc2 का उपयोग करते हुए मैं इस तरह के रूप संकलन:
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin

हम जैसे फ्लॉपी को bootloader.bin लिखें:
dd if=bootloader.bin bs=512 count=1 of/dev/fd0

हम floppy को kernel.sys लिखते हैं जैसे:
cp kernel.sys /dev/fd0

जैसा कि मैंने कहा, इस Bochs में काम करता है। लेकिन फ्लॉपी से बूटिंग हम इतनी तरह आउटपुट प्राप्त:

अन्य बारीकियों को रीबूट करने की प्रेस कुंजी:

लोड हो रहा है कर्नेल शैल
...........
त्रुटि: ओपनएसयूएसई 11.2, गनोम डेस्कटॉप, एएमडी x64 कोई अन्य जानकारी जो मैंने याद की हो, पूछने के लिए स्वतंत्र महसूस करें। मैंने यहां सब कुछ पाने की कोशिश की जिसकी आवश्यकता होगी। अगर मुझे इसकी ज़रूरत है, तो मैं पूरे बूटलोडर.सम को कहीं भी पोस्ट करने का रास्ता ढूंढ सकता हूं। हम वास्तव में कई कारणों से GRUB का उपयोग करने में रूचि नहीं रखते हैं। यह बदल सकता है, लेकिन हम वास्तव में GRUB पर विचार करने से पहले इस बूट को सफल देखना चाहते हैं।

संपादित करें: बूटस्ट्रैप लोडर डिस्क के बूट सेक्टर (बहुत पहले क्षेत्र) में लिखे गए 512 बाइट्स होने का अनुमान है। इसके लिए मेरा शब्द लें, बूटलोडर 512 बाइट संकलित है। कर्नेल अगले ही क्षेत्र में होने का अनुमान है।

+1

मैं अत्यधिक शक है कि तुम सच मतलब 'सीपी kernel.sys/dev/fd0', जो फ्लॉपी डिवाइस को अधिलेखित कर देगा शुरू से। यहां तक ​​कि यदि आप इसे पेस्ट नहीं करते हैं, तो क्या आप वर्णन कर सकते हैं कि आपके बूटलोडर से कर्नेल को स्मृति में लोड करने की उम्मीद है? – ephemient

+0

ठीक है, हाँ वास्तव में मेरा मतलब है। यह एक उदाहरण है जिसे मुझे डिवाइस पर फ़ाइल की प्रतिलिपि बनाने के लिए दिया गया था। क्या यह अलग होना चाहिए?मैं लिनक्स के रास्ते में बहुत नया हूं - मैं विंडोज के बाद से विंडोज में रहा हूं। – IAbstract

+1

आपका 'डीडी' फ्लॉपी के पहले सेक्टर में 'बूटलोडर.बीबी' का एक क्षेत्र लिखता है। फिर आपकी 'cp' प्रतिलिपि' kernel.sys' को सीधे फ्लॉपी पर प्रतिलिपि बनाता है, जो ओवरलैटिंग कर रहा है ... शायद आप फ्लॉपी के दूसरे सेक्टर में 'kernel.sys' रखने शुरू करने के लिए' dd seek = 1' 'का मतलब है? यह निर्धारित करने के लिए कि क्या आप चाहते हैं कि अपने बूटलोडर पर अधिक जानकारी चाहिए। – ephemient

उत्तर

3

यदि आप दूसरे क्षेत्र में शुरू करने के लिए kernel.sys चाहते हैं, तो cp के बजाय इसका उपयोग करें।

dd if=kernel.sys of=/dev/fd0 bs=512 seek=1 

या, यह सोचते हैं bootloader.bin वास्तव में 512 बाइट्स, यह भी काम करता है:

cat bootloader.bin kernel.sys > /dev/fd0 
+0

बूटलोडर.बिन बिल्कुल 512 बाइट्स है ... क्या 'cat ...' कमांड सेक्टर 0 (बूट सेक्टर) पर bootloader.bin डाल दिया जाएगा ??? – IAbstract

+0

यह कच्चे डिवाइस की शुरुआत में शुरू होगा (लिनक्स सुविधाजनक है और ब्लॉक उपकरणों तक गैर-ब्लॉक पहुंच की अनुमति देता है) जो कि क्षेत्र 0 होता है। – ephemient

+0

जाहिर है, यह '/ dev/fd0' को लिखने के साथ एक मुद्दा है। आपके द्वारा प्रदान किए गए नमूने के साथ भी, स्पष्ट रूप से kernel.sys फ़ाइल नहीं लिखी जा रही है। जब मैं फ्लॉपी की एक छवि बना देता हूं, तो यह 1.4 एमबी छवि फ़ाइल देता है; हालांकि, केवल पहले 512 बाइट्स बूटस्ट्रैप के साथ लिखे गए हैं। छवि पर कोई kernel.sys नहीं है। – IAbstract

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