2012-04-04 9 views
6

पिछले हफ्ते के लिए, मैं सीखने के उद्देश्यों और ... "मजेदार" के लिए एक साधारण ओएस विकसित कर रहा हूं। वर्चुअलबॉक्स और एनएसएम टॉव में, मैं वास्तव में एक बहुत अच्छी शुरुआत के लिए बंद हो गया। आखिरकार, मैंने फैसला किया कि मैं फाइल सिस्टम से लोड होने के बिंदु तक कुख्यात Brokenthorn tutorial के माध्यम से बिजली के द्वारा एक बूटलोडर (512-बाइट दीवार को बहुत मुश्किल से मारने के बाद) विकसित करना चाहता था।कार्यशील FAT16 बूटलोडर वास्तविक हार्डवेयर पर पढ़ने की त्रुटि उत्पन्न करता है?

कुछ हेक्सफ़ीएंड शेंगेन और कुछ खाली FAT16 छवियों के साथ, मुझे अंततः बीपीबी ने काम किया। कुछ अतिरिक्त असेंबली हैकरी (ब्रोकेंथर्न के ट्यूटोरियल, part 6 के आधार पर), मुझे अपने बूटलोडर के साथ काम करने वाली फ़ाइल लोडिंग भी मिली है, जो मेरी आभासी डिस्क से उपयुक्त नाम वाली 'बूट' फ़ाइल लोड करती है (डीडी अगर =/dev/zero का उपयोग करके बनाई गई है = boot.img बीएस = 512 गिनती = 2880)

तो, फिर समस्या क्या है?

dd bs=512 count=1 if=compiled/boot.bin of=/dev/disk3 

यहाँ की उम्मीद उत्पादन होता है (VirtualBox में: यह मैं क्या देख जब मैं एक यूएसबी स्टिक के माध्यम से वास्तविक हार्डवेयर के लिए पर लोड है (इस मामले में,/dev/disk3, जहां संकलित फ़ाइल boot.bin है)):

Current output

actual output (एक पुराने लैपटॉप पर)

Old output

की तुलना 210

(मैं वास्तविक डिबग संदेशों के लिए इस्तेमाल किया जाएगा है, लेकिन 512-बाइट सीमा बहुत भीषण है।)

तो, अंतर यह है कि एक USB स्टिक है, और एक एक (आभासी) फ्लॉपी है डिस्क। उनके पास सटीक है जो बीपीबी समेत प्रत्येक पर लोड की गई जानकारी है। हालांकि, एक काम करता है, और कोई नहीं करता है। यहाँ एक क्षेत्र लोड हो रहा है (आह 02h/13h पूर्णांक का उपयोग, जो मैंने सुना है एक यूएसबी के लिए ठीक से काम किया) के लिए मेरे कोड का मुख्य हिस्सा है:

ReadSectors: 
    mov di, 0x0005     ; How many times should we retry the read? 

ReadSectors.loop: 
    ; DEBUG 
    push ax 
    mov ah, 0eh 
    mov al, '-' 
    int 10h 
    pop ax 
    push ax 
    push bx 
    push cx 
    call LBAToCHS 
    mov ah, 02h      ; Set the interrupt to the 
            ; 'read sector' function 
    mov al, 1      ; Only read one sector 
    mov ch, byte[chs.track]   ; The track to read from 
    mov cl, byte[chs.sector]  ; The sector to read from 
    mov dh, byte[chs.head]   ; The head to read from 
    mov dl, byte[_bpb.driveNumber] ; The drive to read from 
    int 13h       ; Call our 'disk IO' interrupt 
    jnc ReadSectors.success   ; If we successfully read the data, 
            ; we don't have to try again 
    mov ah, 00h      ; Set the interrupt to the 
            ; 'reset disk' function 
    int 13h       ; Call our 'disk IO' interrupt 
    dec di       ; Decrement our error counter 
    pop cx 
    pop bx 
    pop ax 
    jnz ReadSectors.loop   ; Try again if we've failed 
    jmp ReadSectors.fail   ; RED ALERT 

(पूर्ण स्रोत, BPB सहित, पर पाया जा सकता pastebin (http://pastebin.com/SeUm7xu6)

मैं विधानसभा के साथ कई मुद्दों पर काबू पाने की है अब तक, लेकिन यह भी मुझे स्टम्प्ड गया है। उम्मीद है, मैं बूट लोडर और अमूर्त फ़ाइल आईओ अतीत जितनी जल्दी हो सके प्राप्त कर सकते हैं।

किसी भी सुझाव की सराहना की जाएगी। अग्रिम धन्यवाद!

उत्तर

6

आपका कोड ड्राइव नंबर 0 से पढ़ता है जो डिवाइस बूटलोडर से लोड नहीं हो सकता है (और अक्सर अगर आप यूएसबी स्टिक से बूट नहीं होते हैं)। आपको जिस ड्राइव नंबर से पढ़ना चाहिए उसे BIOS द्वारा dl रजिस्टर में लोड किया जाना चाहिए। यह SO पर पहले से ही answered question है।

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