मैं असेंबली भाषा में लिखे एक बूटलोडर को ISO छवि फ़ाइल में बदलने की कोशिश कर रहा हूं। निम्नलिखित मिकोस बूटलोडर का कोड है। यहाँ मेरा बूटलोडर कोड है:

   BITS 16
start:
    mov ax, 07C0h     ; Set up 4K stack space after this bootloader
    add ax, 288       ; (4096 + 512) / 16 bytes per paragraph
    mov ss, ax
    mov sp, 4096

    mov ax, 07C0h     ; Set data segment to where we're loaded
    mov ds, ax

    mov si, text_string   ; Put string position into SI
    call print_string ; Call our string-printing routine

    jmp $         ; Jump here - infinite loop!
    text_string db 'This is my cool new OS!', 0

    print_string:         ; Routine: output string in SI to screen
    mov ah, 0Eh       ; int 10h 'print char' function

.repeat:
    lodsb         ; Get character from string
    cmp al, 0
    je .done      ; If char is zero, end of string
    int 10h           ; Otherwise, print it
    jmp .repeat
.done:
    ret

    times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
    dw 0xAA55     ; The standard PC boot signature

मैंने निम्न कमांड टाइप की:

nasm -f bin -o boot.bin boot.asm 

यह कमांड ठीक काम करता है और यह एक .bin आउटपुट देता है। आगे मैंने निम्न कमांड टाइप की:

dd if=boot.bin of=floppy.img count=1 bs=512 

यह भी ठीक काम किया और मुझे .img आउटपुट फ़ाइल दी। जब मैं यह कमांड टाइप करता हूं:

dd if=boot.bin of=floppy.img skip seek=1 count=1339

मुझे निम्न त्रुटि मिलती है: dd: unrecognized operand ‘skip’। मैं DD प्रलेखन में पढ़ता हूं कि स्किप विशेषता के पास इसके लिए एक नंबर होना चाहिए। किसी भी विचार को मुझे किस नंबर को छोड़ना विशेषता के साथ टाइप करना चाहिए (उदा। स्किप = 1)।

अगला मैं निम्नलिखित कमांड टाइप करता हूं:

mkdosfs -C floppy.img 1440 

मुझे निम्न त्रुटि मिलती है: mkdosfs: unable to create floppy.img। मैं जिन समस्याओं का सामना कर रहा हूं, उन्हें कैसे ठीक करूं? वहाँ एक और आसान तरीका है मैं अपने बूटलोडर .bin फ़ाइल को ISO छवि में बदल सकता हूं?

9
Mahmoud Abdel-Rahman 14 पद 2015, 16:41

1 उत्तर

सीडी के लिए; एक विनिर्देश है ("एल टोरिटो") जो बताता है कि बूट करने योग्य सीडी कैसे काम करती है; जहां पहले 16 (2048-बाइट) सेक्टर अप्रयुक्त होते हैं, वहां एक "बूट कैटलॉग" होता है, जिसे फर्मवेयर यह तय करने के लिए उपयोग करता है कि उसे किस बूट लोडर का उपयोग करना चाहिए (इसलिए आपके पास एक ही सीडी हो सकती है जो बहुत अलग सिस्टम बूट करती है - जैसे पीसी BIOS, यूईएफआई , PowerPC, आदि), फिर बूट लोडर स्वयं।

अकेले "पीसी BIOS" के लिए, 3 संभावनाएँ हैं:

  • एक फ्लॉपी डिस्क का अनुकरण करें (सीडी पर संग्रहीत "फ्लॉपी डिस्क छवि" का उपयोग करके)
  • हार्ड डिस्क का अनुकरण करें (सीडी पर संग्रहीत "हार्ड डिस्क छवि" का उपयोग करके)
  • कोई अनुकरण नहीं

पहले 2 विकल्प ज्यादातर हमवतन उद्देश्यों के लिए हैं (केवल पुराने ओएस जो सीडी से बूटिंग का समर्थन नहीं करते हैं, जैसे एमएस-डॉस); और प्रदर्शन के निहितार्थ हैं (उदाहरण के लिए एक 512-बाइट आभासी क्षेत्र को लोड करने के लिए फ़र्मवेयर, एक वास्तविक 2048-बाइट सेक्टर को लोड करना और 1536 बाइट को फेंकना है)। पिछले 15+ वर्षों में डिज़ाइन किया गया कोई भी OS "कोई अनुकरण नहीं" होना चाहिए।

"कोई अनुकरण नहीं" के लिए:

  • फर्मवेयर आपके पूरे बूट लोडर को लोड करता है (जो लगभग 512 KiB तक हो सकता है) और न केवल एक सेक्टर
  • सीडी पर सेक्टर 2048 बाइट्स हैं (और 512 बाइट्स नहीं); और के माध्यम से लोड किया जाना चाहिए। "int 0x13 एक्सटेंशन" (और पुराने / सीमित "CHS डिस्क फ़ंक्शंस" जो आप फ़्लॉपी के लिए उपयोग करेंगे)
  • BIOS पैरामीटर ब्लॉक की कोई आवश्यकता नहीं है (जिसे फ्लॉपी डिस्क के लिए अनिवार्य माना जाना चाहिए)
  • विभाजन तालिका की कोई आवश्यकता नहीं है (जिसे GPT सहित हार्ड डिस्क के लिए अनिवार्य माना जाना चाहिए)
  • आप शायद फ़ाइल सिस्टम के रूप में ISO9660 का समर्थन करना चाहते हैं (कर्नेल और / या अन्य फ़ाइलों को खोजने के लिए जिन्हें बूट लोडर को लोड करने की आवश्यकता है) और एफएटी नहीं।

यह भी ध्यान दें कि (सामान्य रूप से) "पीसी BIOS" के लिए आप शायद 5 अलग-अलग बूट लोडर (एक फ्लॉपी के लिए, एक "एमबीआर विभाजन वाली" हार्ड डिस्क के लिए चाहते हैं, एक "जीपीटी पार्टीशन के लिए" हार्ड डिस्क, एक सीडी के लिए,) और नेटवर्क बूट के लिए एक)। ये सभी मामले पर्याप्त भिन्न हैं (और "एक 512-बाइट प्रारंभिक क्षेत्र केवल" इन मामलों में से 3 के लिए सीमा पर्याप्त प्रतिबंधात्मक है) "एक बूट लोडर द्वारा समर्थित सभी उपकरणों" को आपदा बनाने के लिए।

वास्तव में आईएसओ उत्पन्न करने के लिए; आप एक मौजूदा टूल (जैसे mkisofs) का उपयोग कर सकते हैं, या आप अपना खुद का टूल लिख सकते हैं (ISO9660 और "El Torito" दोनों को समझना अपेक्षाकृत आसान है, और ISO बनाने के लिए अपना खुद का टूल लिखना 2 दिनों से भी कम समय में किया जा सकता है) जो ओएस विकास परियोजनाओं के लिए महासागर में एक बूंद की तरह है)।

6
Brendan 14 पद 2015, 21:41