我正在尝试将我在汇编语言中编写的引导加载程序转换为 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 图像吗?
答案 0 :(得分:18)
您似乎找到了从此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 的块的默认大小)。 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启动的硬件旧操作系统,如MS-DOS);并且具有性能影响(例如,模拟加载一个512字节的虚拟扇区,固件必须加载一个真正的2048字节扇区并丢弃多余的1536字节)。在过去15年中设计/编写的任何操作系统都应使用“无仿真”。
对于“无仿效”:
另请注意(一般情况下)对于“PC BIOS”,您可能需要5种不同的引导加载程序(一种用于软盘,一种用于“MBR分区”硬盘,一种用于“GPT分区”硬盘,一种用于CD,一个用于网络启动)。这些情况都是不同的(并且“对于其中3个案例中的”仅限一个512字节的初始扇区“限制是足够的限制),以使”一个引导加载程序支持的所有设备“的想法成为灾难。
实际生成ISO;您可以使用现有工具(例如mkisofs),或者您可以编写自己的工具(ISO9660和“El Torito”都相对容易理解,编写自己的工具来生成ISO可以在不到2天的时间内完成,这对于OS开发项目来说就像海洋一样。)