如何将bin文件(512字节)写入软盘的第一个扇区(扇区0)?

时间:2015-10-01 17:40:19

标签: assembly bios osdev bare-metal floppy

如何将.bin文件写入软盘/虚拟软盘/软盘映像的第一个扇区?

我正在尝试启动一个简单的512字节引导加载程序。各地的大小都说“512字节”,所以我应该已经很好了。

其他信息:

引导程序只显示一个字符串,我正在学习简单程序集。一些工作是在Windows中完成的,一些工作在Ubuntu 14.04(Trusty Tahr)(如果这很重要)。

即使它具有引导加载程序符号,它也无法启动。

3 个答案:

答案 0 :(得分:14)

如果您使用的是Linux,则可以使用 DD 实用程序执行此操作。 Microsoft Windows也有 DD 的版本。

一般DD用法

如果你想制作零填充的虚拟磁盘映像,大小为720K软盘,你可以使用 dd

dd if=/dev/zero of=disk.img bs=1024 count=720

这将创建一个名为disk.img的文件,其大小为1024 * 720 = 737280字节。可以使用以下命令创建1.44MB的零填充软盘映像。

dd if=/dev/zero of=disk.img bs=1024 count=1440

将二进制图像写入从图像开始处开始的虚拟软盘可以这样做:

dd if=bootload.bin of=disk.img conv=notrunc 

此示例获取文件bootload.bin并将其放在磁盘映像的开头(在本例中称为disk.img)而不截断(conv=notrunc)如果您不这样做在虚拟磁盘映像上使用conv=notrunc,它将写入bootload.bin并将磁盘映像截断为引导加载程序的大小。

DD 还可以通过跳转到磁盘开头以外的位置来写入磁盘映像的特定部分。如果您需要在特定扇区中放置信息(代码/数据),这将非常有用。此示例可用于将引导加载程序的第二阶段放在磁盘映像的第一个512字节扇区之后:

dd if=stage2.bin of=disk.img bs=512 seek=1 conv=notrunc

bs=512将块大小设置为512(因为它是大多数软盘扇区的典型大小,因此更容易)。 seek=1寻找超过图像开头的第一个块(512字节),然后写入文件stage2.bin。我们需要再次conv=notrunc,因为我们不希望 DD stage2.bin结束时截断磁盘映像。

dd if=stage2.bin of=disk.img bs=512 seek=18 conv=notrunc

此示例与上一个示例类似但在写入stage2.bin

之前跳过9216字节(512 * 18)

如果你有一张连接到Linux系统的软盘(以及root访问权限),你可以用类似

的方式编写bootloader
dd if=bootload.bin of=/dev/fd0 

其中/dev/fd0是软盘的设备。 /dev/fd0通常是软盘A(如果存在)而/dev/fd1是软盘B(如果存在)。

Windows for Windows

如果您在Microsoft Windows上运行,则可以使用 DD 实用程序的here版本。最新下载是dd-0.6beta3.zip,是推荐的最低版本。它有一些老年人没有的功能。只需打开zip文件并将其解压缩到Windows路径上的某个位置即可。

答案 1 :(得分:1)

听起来很迷人。

我在当天很多次写到软盘的前512个字节。我想在更深层次上了解它。

Roadkil的扇区编辑器执行此操作,它让您打开屏幕上的前512个字节,并将其保存到文件中,然后打开前512个字节的文件,并将其保存到软盘中。

http://www.roadkil.net/program.php?ProgramID=24

有趣的是,有一个关于启动事物的经典网站,由一个名字与你相似的人,starman ...... http://starman.vertcomp.com/asm/mbr/虽然软盘是非分区媒体,因此没有MBR。

我确定我保存了前面的512个字节。 Windows 98软盘,它说启动Windows 98然后进入C提示符。它可以改为例如Windows 95软盘。你知道如果3个核心文件之一出现问题,XP可以拥有3个文件启动盘。那么,它有一个独特的启动扇区。它不是dos启动盘。我记得XP中的格式命令与98中的格式命令不同.98中的格式命令就像DOS一样,它有一个格式/ s来制作系统盘。 XP我认为不可能......而且我注意到Win7格式命令也不能。虽然在XP或7中,我认为您可以通过在我的计算机中右击A后勾选一个框来从GUI制作dos启动盘。您可以使用的另一件事是* nix style dd命令。或ddrescue(提供比dd更多的信息)。一个类似的程序是Bart的BBIE,它可以获取CD的可引导部分并将其提取出来。 Nero(也许仍然是)能够获取512字节的软盘启动扇区,并根据它创建一张CD。因此,如果你有一个可启动的DOS磁盘,你可以制作一个可启动的DOS CD。它有一个选项,让你可以浏览到具有该引导记录的图像,或者只是将软盘放入并让它提取它。

答案 2 :(得分:-1)

要将文件写入另一个文件,您可以编写程序。以下片段在C。

char buf[512];
int floppy_desc, file_desc;
file_desc = open("xx.bin", O_RDONLY);
read(file_desc, buf, 512);
close(file_desc);

floppy_desc = open("floppy.img", O_RDWR);
lseek(floppy_desc, 512, SEEK_SET);
write(floppy_desc, buf, 512);
close(floppy_desc);