linux - 使用自定义引导加载程序创建可引导 ISO 镜像

标签 linux assembly nasm osdev dd

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

   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:无法创建 floppy.img。如何解决我遇到的问题?有没有另一种更简单的方法可以将我的引导加载程序 .bin 文件转换为 ISO 镜像?

最佳答案

看来您找到了从这个 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 block 的默认大小)。 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

关于linux - 使用自定义引导加载程序创建可引导 ISO 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268518/

相关文章:

python - 我如何知道 "path"是否位于 FAT32 分区中?

计算C文件代码部分的大小

linux - 停止缓冲区溢出 - NASM 输入

python - Travis-CI 找不到 python3-pip 包

linux - 禁用内核跟踪器

linux - OpenGL glutSwapBuffers 不绘制场景

c - 将汇编语言转换为C语言代码

security - 缓冲区溢出 - 程序在生成 shell 后终止

c++ - 循环展开和循环平铺

assembly - 影响输出的声明标签的位置