如何将.bin文件写入软盘/虚拟软盘/软盘映像的第一个扇区?
我正在尝试启动一个简单的512字节引导加载程序。各地的大小都说“512字节”,所以我应该已经很好了。
其他信息:
引导程序只显示一个字符串,我正在学习简单程序集。一些工作是在Windows中完成的,一些工作在Ubuntu 14.04(Trusty Tahr)(如果这很重要)。
即使它具有引导加载程序符号,它也无法启动。
答案 0 :(得分:14)
如果您使用的是Linux,则可以使用 DD 实用程序执行此操作。 Microsoft Windows也有 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
如果你有一张连接到Linux系统的软盘(以及root访问权限),你可以用类似
的方式编写bootloaderdd if=bootload.bin of=/dev/fd0
其中/dev/fd0
是软盘的设备。 /dev/fd0
通常是软盘A(如果存在)而/dev/fd1
是软盘B(如果存在)。
如果您在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);