我刚刚读到有关计算机的整个启动过程的文章,很好奇为什么 BIOS 只能从启动磁盘的 0 柱面、0 磁道和 1 扇区读取和执行代码和数据?为什么 BIOS 不能从任何其他磁盘位置读取?
答案1
您阅读的文档显然已经过时了 10 到 15 年。只有在旧的 PC98 固件(以及之前的 PC97 和 PC/AT 固件)上,您的假设和另一个答案中匿名提供的信息才成立。个人计算机/工作站固件主要有三类(尽管还有几个不太知名的固件,如果要完整回答标记为“linux”的问题,也应该严格涵盖这些固件):
- PC98 固件 在 PC98 系统上,固件不了解磁盘分区或文件系统格式。它甚至不知道块 #0 中的 (MBR) 分区表是什么,即使它加载并运行块 #0 中的代码。块 #0 中的代码知道在其内部查找活动主分区,并加载和运行其卷引导记录。只有在这种类型的固件上,您的假设和其他答案中的信息才成立。
- ARC 固件在 ARC 系统上,固件做了解磁盘分区和至少一种文件系统格式,即 FAT。在此类系统中,固件才不是加载并运行块 #0。相反从 FAT 磁盘卷上的普通文件加载并运行可执行程序映像。该可执行程序将是一个引导加载程序,然后从磁盘卷上的另一个普通文件(不一定是 FAT,如果引导加载程序有自己的额外文件系统驱动程序)加载并运行 Linux 内核。
- EFI 固件在 EFI 系统上,固件做了解磁盘分区和至少一种文件系统格式,即 FAT。在此类系统中,固件才不是加载并运行块 #0。相反具有内置的启动管理器,允许用户从 FAT 磁盘卷上的普通文件中的可执行程序映像菜单中进行选择。该可执行程序将是一个引导加载程序,然后从磁盘卷上的另一个普通文件(不一定是 FAT,如果引导加载程序有自己的额外文件系统驱动程序)加载并运行 Linux 内核。如果磁盘使用 EFI 分区表进行分区,则固件(取决于它对 EFI 规范的严格程度)甚至不必读取磁盘的块 #0根本。
它应该让您了解您能读到的和在这个领域传播的一些信息有多么过时,请注意“PC98”中的“98”实际上代表 1998 年。世界已经改变,固件不理解磁盘分区方案、不理解文件系统格式,只知道如何读取和加载磁盘上的一个块的观念早已过时。
答案2
柱面 0、磁道 0、扇区 1 基本上意味着从硬盘的逻辑开头开始。在启动过程中,ROM BIOS 在执行 POST 后会加载引导记录。在这种状态下,引导加载程序几乎没有任何工作要做 - 它所做的就是转到预定点并开始加载操作系统代码。硬编码的位置是 0-0-1。就像我给你一本书一样,期望你从第一页开始阅读,而不是第 25 页,因此引导加载程序从这个起始位置开始。
答案3
理论上,BIOS 可以从磁盘上的任何位置读取数据。但为什么会这样呢?它根本不知道这些位代表什么。如果 BIOS 试图直接与引导块之外的内容交互,并且与全盘加密完全不兼容,那么它就太糟糕了。
拥有(实际上硬编码到主板中的)BIOS仅有的与引导块交互意味着磁盘的其余部分可以包含任何事情,因为您只需将解释该内容的代码放入引导块中即可执行。如果您想在磁盘上放置不同(且不兼容)的内容,只需适当更新引导块即可。