पिछले हफ्ते के लिए, मैं सीखने के उद्देश्यों और ... "मजेदार" के लिए एक साधारण ओएस विकसित कर रहा हूं। वर्चुअलबॉक्स और एनएसएम टॉव में, मैं वास्तव में एक बहुत अच्छी शुरुआत के लिए बंद हो गया। आखिरकार, मैंने फैसला किया कि मैं फाइल सिस्टम से लोड होने के बिंदु तक कुख्यात 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 है)):
actual 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)
मैं विधानसभा के साथ कई मुद्दों पर काबू पाने की है अब तक, लेकिन यह भी मुझे स्टम्प्ड गया है। उम्मीद है, मैं बूट लोडर और अमूर्त फ़ाइल आईओ अतीत जितनी जल्दी हो सके प्राप्त कर सकते हैं।
किसी भी सुझाव की सराहना की जाएगी। अग्रिम धन्यवाद!