我正在制作自己的操作系统,而且我已经阅读了有关自制OSdev的所有信息。但是,我不明白如何制作一个两阶段的引导加载程序。更具体地说,我无法理解如何在FAT32文件系统上找到第二阶段。
图:第一阶段 - >第二阶段(启用pmode,gdt等) - >内核
USB规格:
任何建议???
答案 0 :(得分:1)
我自己正在编写一个自编的操作系统二(现在超过一年)。我为FAT12 / 16和FAT32编写了一个两阶段引导加载程序,并且存在显着差异:
据我所知,即使Windows要么坚持第二阶段文件是根目录中的第一个文件之一(在这种情况下需要引导扇区中的代码较少),或者使用一些具有固定扇区号的额外扇区到"延伸"引导扇区的大小> 512字节。
对于应该与同一磁盘上的其他系统共存的自有操作系统,这两种方法都无法正常工作。
我的启动加载程序按以下方式工作:
计算第一个集群的扇区号。它包含一个子程序,它可以按给定的簇号读取扇区(它们是32位!)和簇相关扇区。
读取根目录的第一个扇区(群集号已知)并搜索包含第二阶段代码的文件。然后读取第二个扇区,依此类推。
当读取群集的所有扇区时,必须读取FAT以获取根目录的下一个群集的群集号。这是FAT12 / 16引导加载程序的第二阶段代码中的部分,但必须位于FAT32引导加载程序的引导扇区中。
一旦找到目录条目,您就会加载第二阶段文件的第一个集群的第一个扇区。加载文件的其余部分可以通过第二阶段文件的第一个扇区中的代码来完成!
当使用INT 13h,功能42h(BIOS支持的线性磁盘读取比1995年更新)时,如果仅使用非常短的错误消息,则启动扇区的512字节就足够了。使用INT 13h,功能2(C / H / S磁盘读取)我没有设法编写FAT32引导扇区,因为512字节是不够的。
答案 1 :(得分:0)
您确定需要编写自己的引导加载程序吗?
已经有很多x86引导程序可用(Lilo,Grub和Extlinux等)。它们不是Linux特有的;只要您的操作系统符合the multiboot specification,他们中的任何一个都可以启动您的操作系统。使用其中任何一个都可以节省大量的开发时间。
总而言之,定位第二阶段引导加载程序的最常用方法是:
OR