使用自定义引导加载程序创建可引导的ISO映像

时间:2015-12-14 13:41:44

标签: linux assembly nasm osdev dd

我正在尝试将我在汇编语言中编写的引导加载程序转换为 ISO 映像文件。以下是MikeOS bootloader中的代码。这是我的引导程序代码:

Dim oInStream, sRows, arrRows, c
Do Until oInStream.AtEndOfStream
    sRows = oInstream.ReadLine
    arrRows = Split(sRows, ";")%>
    <tr>
        <%For c = 0 To UBound(arrRows, 1)
            If c <> 3 Then%>
                <td><div align="center">
                    <%= arrRows(c) %>
                </div></td>
            <%Else%>
                <img src="<%= arrRows(c) %>" alt="An image" />
            <%End If
        Next 'c%>
    </tr>
<%Loop

我输入以下命令:

   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

此命令工作正常,它提供.bin输出。接下来我输入以下命令:

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

这也很好,并给了我.img输出文件。当我输入此命令时:

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

我收到以下错误:dd if=boot.bin of=floppy.img skip seek=1 count=1339 。我在 DD 文档中读到了skip属性必须为其分配的编号。我应该用skip属性输入什么数字(例如,跳过= 1)。

接下来,我输入以下命令:

dd: unrecognized operand ‘skip’

我收到以下错误:mkdosfs -C floppy.img 1440 。我如何解决我遇到的问题?还有另一种更简单的方法可以将我的bootloader .bin文件转换为 ISO 图像吗?

2 个答案:

答案 0 :(得分:18)

您似乎找到了从此StackOverflow Answer创建可启动 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

答案 1 :(得分:5)

对于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开发项目来说就像海洋一样​​。)