我正在尝试将我用汇编语言编写的引导加载程序转换为 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 发行版上,存在名为 genisoimage
或 mkisofs
的程序。现在它们实际上是同一个程序。无论您有什么,都可以在下面的示例中替换。我的示例将假定 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/