簡體   English   中英

使用自定義引導加載程序創建可引導的ISO映像

[英]Creating a bootable ISO image with custom bootloader

我試圖將我用匯編語言編寫的引導加載程序轉換為ISO映像文件。 以下是MikeOS bootloader的代碼。 這是我的引導程序代碼:

   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文檔中讀到skip屬性必須分配一個編號。 任何想法我應該使用skip屬性鍵入什么數字(例如,skip = 1)。

接下來我輸入以下命令:

mkdosfs -C floppy.img 1440 

我收到以下錯誤: mkdosfs: unable to create floppy.img 我如何解決我遇到的問題? 還有另一種更簡單的方法可以將我的bootloader .bin文件轉換為ISO映像嗎?

您似乎找到了從此StackOverflow應答程序創建可引導ISO映像的示例。 不幸的是,您在許多方面選擇了一個不正確的答案。 假裝你從未見過那個答案。

在大多數Linux發行版中,存在一個名為genisoimagemkisofs的程序。 這些天他們實際上是同一個程序。 您可以在下面的示例中替換您的任何一個。 我的例子將假設ISO創建實用程序稱為genisoimage


在您的問題中,您在名為boot.asm的文件中有一些引導加載程序代碼。 您正確地將其組裝到引導扇區二進制映像:

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

這會創建boot.bin ,這是你的引導扇區。 下一步是創建一張軟盤映像並將boot.bin放在第一個扇區中。 你可以這樣做:

dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=boot.bin of=floppy.img seek=0 count=1 conv=notrunc

第一個命令只是使零填充磁盤映像等於1.44MB軟盤(1024 * 1440字節)的大小。 第二個命令將boot.bin放入floppy.img的第一個扇區,而不截斷文件的其余部分。 seek=0表示尋找第一個扇區(512字節是DD的默認塊大小)。 count=1指定我們只想從boot.bin復制1個扇區(512字節)。 conv=notrunc表示寫入輸出文件后,剩余的磁盤映像將保持不變(不截斷)。


構建如上所示的磁盤映像后,可以使用以下命令創建ISO映像:

mkdir iso
cp floppy.img iso/
genisoimage -quiet -V 'MYOS' -input-charset iso8859-1 -o myos.iso -b floppy.img \
    -hide floppy.img iso/

上面的命令首先創建一個名為iso的子目錄,它將包含要放在最終CD-ROM映像上的文件。 第二個命令除了將我們的floppy.img復制到iso目錄之外沒有做任何事情,因為我們需要它來啟動。 第三個命令執行繁重的工作並構建ISO映像。

  • -V 'MYOS'設置音量標簽(它可以是你想要的任何東西)
  • -input-charset iso8859-1設置正在使用的字符集。 不要改變它
  • -o myos.iso表示ISO映像將輸出到文件myos.iso
  • -b floppy.img表示我們的ISO可以啟動,正在使用的啟動映像是文件floppy.img
  • -hide floppy.img不需要,但它隱藏了最終ISO目錄列表中的啟動映像。 如果您要掛載此ISO並在其上執行ls以列出文件,則不會出現floppy.img
  • iso/在命令的末尾是將用於構建ISO映像的目錄。 它至少需要包含我們的可啟動軟盤映像,但您可以將所需的任何其他文件放入iso/目錄中。

可以引導生成的ISO映像myos.iso 使用QEMU啟動此類圖像的示例:

qemu-system-i386 -cdrom ./myos.iso

對於CD; 有一個規范(“El Torito”)描述了可引導CD的工作原理; 在未使用前16個(2048字節)扇區的地方,有一個“引導目錄”,固件使用它來決定它應該使用哪個引導加載程序(因此你可以使用一張CD來啟動非常不同的系統 - 例如PC BIOS,UEFI ,PowerPC等),然后是引導加載器本身。

僅對於“PC BIOS”,有3種可能性:

  • 模擬軟盤(使用存儲在CD上的“軟盤映像”)
  • 模擬硬盤(使用存儲在CD上的“硬盤映像”)
  • 沒有仿真

前兩個選項主要用於兼容目的(不支持從CD啟動的硬件舊操作系統,如MS-DOS); 並且具有性能影響(例如,為了模擬加載一個512字節的虛擬扇區,固件必須加載一個真正的2048字節扇區並丟棄多余的1536字節)。 在過去15年中設計/編寫的任何操作系統都應使用“無仿真”。

對於“無仿效”:

  • 固件加載整個引導加載程序(最高可達512 KiB)而不只是一個扇區
  • CD上的扇區是2048字節(而不是512字節); 並應通過加載。 “int 0x13 extensions”(而不是您用於軟盤的舊/有限“CHS磁盤功能”)
  • 不需要BIOS參數塊(對於軟盤應該被認為是強制性的)
  • 不需要分區表(對於硬盤,包括GPT,它應該被認為是必需的)
  • 您可能希望支持ISO9660作為文件系統(以查找引導加載程序需要加載的內核和/或其他文件)而不是FAT。

另請注意(一般情況下)對於“PC BIOS”,您可能需要5種不同的引導加載程序(一種用於軟盤,一種用於“MBR分區”硬盤,一種用於“GPT分區”硬盤,一種用於CD,和一個用於網絡啟動)。 這些情況都足夠不同(並且“對於這些情況中的3個”僅限於一個512字節的初始扇區“限制是足夠的限制)以使”一個引導加載程序支持的所有設備“想法成為災難。

實際生成ISO; 您可以使用現有工具(例如mkisofs),或者您可以編寫自己的工具(ISO9660和“El Torito”都相對容易理解,編寫自己的工具來生成ISO可以在不到2天的時間內完成,這對於OS開發項目來說就像是一片海洋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM