所以我正在探索引导加载程序是如何工作的,我遇到了一个我似乎找不到任何答案的问题。引导加载程序如何确切地知道它必须读取多少个扇区才能加载整个内核?
我正在编写一个引导加载程序,必须通过计算确切的扇区数量来手动更改要读取的扇区数量,这真是太痛苦了。当然有一种方法可以自动化这个过程,但我不知道如何做。我听说过文件系统、BPB 和 BDB,但我对所有这些东西感到困惑。我真的很想知道整个过程是如何进行的。 Fat12 是一个简单的文件系统,但是如果内核是太大对于软盘?
任何解释都将受到欢迎。
答案1
传统的引导加载程序是多级的。具有 MBR 分区表的系统的第一阶段引导加载程序的引导加载程序与分区表位于同一块中,紧接在分区表之后。
此代码将查看分区表,找到设置了可引导标志(“激活”)的主分区,然后运行该分区的第一个块中的代码。该代码(通常不会比第一个代码复杂多少)然后将加载第二阶段引导加载程序。使用了多种技术来查找第二阶段引导加载程序,包括仅读取轨道中剩余的所有块,以及使用写入该轨道的块列表来加载特定块(LILO 采用了后一种方法)。
第二阶段引导加载程序通常足够聪明,知道如何在引导分区的文件系统中找到操作系统的其余部分。
更现代的系统使用 UEFI,其中固件本身具有一个微型操作系统,该操作系统至少足够智能,可以读取 FAT 格式分区,并且可以从 FAT 格式 EFI 分区加载和验证标准格式 EFI 可执行文件,这些通常是您的第二阶段加载程序完全理解操作系统的特定分区格式来加载操作系统的其余部分。
如果您正在编写自己的操作系统,处理此问题的最简单方法可能是从编写 EFI 格式的可执行文件开始。