引导加载程序存储在哪里 - ROM、RAM 还是其他地方?

引导加载程序存储在哪里 - ROM、RAM 还是其他地方?

根据维基百科条目,引导加载程序是存储在 ROM(主存储器 (RAM) 的一部分,不是吗?)中的小程序,只能读取而不能擦除。我有点困惑。这是否意味着我们购买的每个 RAM 都默认安装了引导加载程序?此外,我从一本书中读到,硬盘上通常有一个称为 MBR(主引导记录)的区域,其中包含引导加载程序...

那么这个引导加载程序到底位于何处?不同的操作系统是否将其引导加载程序存储在不同的地方?

答案1

ROM 是独立于 RAM 的芯片。它不需要电源来保存其内容,最初无法通过任何方式进行修改,但出厂时已硬连线。后来,PROM(即可编程只读存储器)取代了真正的 ROM。这些芯片出厂时是空白的,可以使用特殊程序写入一次,该程序本质上是烧毁芯片的某些部分,从而改变其状态。后来,EPROM(即可擦除可编程存储器)取代了 ROM。这些芯片上有一个小窗口,如果用紫外线照射它们,就可以擦除,从而可以再次对它们进行编程。后来,EEPROM(即电可擦除可编程存储器)取代了 ROM。这些芯片有一个特殊的软件程序来擦除它们,以便可以重新编程。ROM 通常仍用于统称所有这些类型。

主板上有一些 ROM 芯片,用于保存固件,在 PC 术语中通常称为 BIOS,即基本输入输出系统,不过现在它已被 EFI 固件取代。这是 CPU 在开机时首先开始执行的软件。所有固件都会执行硬件初始化,通常提供一些诊断输出,并为用户提供配置硬件的方法,然后定位并加载引导加载程序,后者又定位并加载操作系统。

使用 PC BIOS,它只是加载并执行它决定从其启动的磁盘的第一个扇区,这通常是检测到的第一个硬盘。按照惯例,硬盘的第一个扇区称为主引导记录,包含一个 DOS 分区表,其中列出了磁盘上分区的位置,并为引导加载程序留出了一些空间。Ubuntu 使用 GRUB 引导加载程序,它在 MBR 中放置了足够的代码来加载和执行/boot/grub/core.img。通常,此文件的副本放在 MBR 之后但在第一个分区之前的扇区中,这实际上是 MBR 加载的,因为/boot/grub/core.img在 MBR 中可用的空间非常有限的情况下,很难正确找到的位置。

grub 核心映像包含基本的 grub 代码,以及需要访问的任何模块,/boot/grub以便它可以在那里加载其他模块,还有描述可以启动哪些操作系统以及在哪里可以找到它们的 grub 配置文件。

在 Intel Mac 上使用的 EFI 固件可以替代大多数最新 PC 主板上的 BIOS,它需要一个专用的分区来保存引导加载程序文件,并且固件足够智能,可以找到这些文件并加载其中一个,而不是仅仅加载和执行磁盘第一个扇区中的任何内容。

答案2

ROM 不在主存储器中:

ROM 不是主存储器的一部分。它是一个单独的芯片,大多数时候内置在更大的 IC 中。更多示例,您的 PC 可能包含多个 ROM。它们内置在您的主板中。

一般来说 :

  • ROM 的内存容量非常小。这些内存是非易失性的,也就是说,存储在 ROM 中的程序不会因断电而被删除。
  • ROM 用于存储永久程序,这对于硬件的正确运行至关重要。
  • ROM 的一个典型例子是 BIOS 芯片。其中存储了非常低级的引导和初始化硬件的程序

您提到,您读过一篇文章,其中作者说,“ROM 是主存储器的一部分”。这令人困惑,因为通常主存储器指的是易失性内存,例如 RAM。但是,如果你使用主存储器如果将 PC 的整个内存空间称为一个术语,那么 ROM 就是该内存空间的一部分。需要注意的是,主内存通常不包括 ROM 之类的内存

Bootloader 存储在哪里:

现代系统使用两阶段引导加载。第一步,从硬盘的一个扇区(通常称为引导扇区)加载一个小程序。这个小程序依次从磁盘上的某个位置加载一个程序,这个程序称为引导加载程序。最后,引导加载程序加载操作系统。

对于Ubuntu系统来说,流程如下:

  1. 打开 PC 后,BIOS(存储在 ROM 中)会自动运行并初始化 PC 硬件的各个部分。然后它会在定义的第一个启动设备(通常是硬盘)中查找特定扇区。该扇区是引导扇区,大小为 512 字节。

  2. 引导扇区中的程序被加载到内存中(第一阶段)。这个小程序包含下一步应将哪些程序加载到内存中以及该程序在磁盘或引导设备中的位置的信息。它会加载该程序。在 Ubuntu 中,它是/boot/grub/core.img

  3. 在第二阶段,OS-Loader(GRUB)通过将内核和初始 RAM 磁盘加载到内存中并将控制权移交给内核来加载 Ubuntu。然后内核运行并加载所有必要的程序,如显示管理器、GUI 等。

因此,我们可以清楚地说,引导加载程序既不存储在 ROM 中,也不存储在 RAM 中,它实际上存储在硬盘上(或其他启动设备,如可启动 CDROM、USB 驱动器等),准确地说是硬盘的第一个扇区,大小为 512 字节,通常称为引导扇区并且这个引导加载程序会加载也位于硬盘(即/boot/grub/文件夹)中的 OS 加载程序(在 Ubuntu 中为 grub),它的任务是加载 OS(比如,Ubuntu)。

作为测试,请移除硬盘(和所有其他启动设备)并尝试启动。您可以进入 BIOS 步骤,但在此步骤之后,您将无法启动任何设备。BIOS 很可能会显示“未找到启动设备“ 或者 ”未找到操作系统“或类似的东西。

希望这个答案能有所帮助。


欲了解更多信息,请访问以下链接:

  1. http://en.wikipedia.org/wiki/Read-only_memory
  2. http://en.wikipedia.org/wiki/Random-access_memory

答案3

x86 兼容处理器总是以所谓的“实”模式启动,这是一种 16 位模式,具有 1 兆字节的可寻址内存。从该地址空间中,640K 可用于程序,而高于该地址的地址则映射到不同的设备。

例如,从 0xA000:0x0000 开始的地址被映射到视频 RAM,因此,在那里写入数据实际上会将数据写入视频适配器的内存中,从而在屏幕上显示像素。

相似地,BIOSROM 从 0xF000:0000 开始,因此 CPU 在通电时会从该预定义地址开始逐条执行指令。BIOS ROM 包含初始程序,该程序通过执行“开机自检”或 POST 启动。摘自维基百科:

BIOS 软件内置于 PC 中,是 PC 开机时运行的第一个代码(“启动固件”)。当 PC 启动时,BIOS 的第一项工作是开机自检,即初始化和识别系统设备,例如 CPU、RAM、视频显示卡、键盘和鼠标、硬盘驱动器、光盘驱动器和其他硬件。然后,BIOS 找到存储在外围设备(称为“启动设备”)(例如硬盘或 CD/DVD)上的引导加载程序软件,并加载和执行该软件,从而控制 PC。2这一过程称为引导或启动,是 bootstrapping 的缩写。

BIOS 固件负责将磁盘的第一个扇区读入内存,并将控制权传递给位于特定地址的小程序。膜生物反应器然后,引导加载程序可以直接开始加载操作系统(就像 MS-DOS 的情况一样)或加载“第二阶段”,而这并不局限于单个磁盘扇区的范围。

使用多阶段方法的引导加载程序可能非常复杂,具有文本或图形界面,允许用户选择从哪个磁盘或分区加载操作系统。

因此,如果您像 Uri 建议的那样对 Windows 引导加载程序和 GRUB 是否可以共存感兴趣,那么答案是:实际的 MBR 只能包含一个第一阶段的引导加载程序(拜托,整个扇区只有 512 字节),但引导加载程序的第二阶段可能能够从不同的分区“链式加载”操作系统。Windows 引导加载程序只能识别和加载 Windows,而 GRUB 能够加载 Linux 或将控制权传递给存储在卷引导记录其中一个分区的启动,允许启动 Windows 或其他操作系统。后一个过程称为链式加载。

当您在装有 Windows 的计算机上安装 Ubuntu 时,GRUB 将被安装到 MBR 中,您将能够启动 Ubuntu 和 Windows。

但是,如果在 Ubuntu 之后安装 Windows,GRUB 将被 Windows 引导加载程序替换,您需要重新安装 GRUB 才能再次启动 Ubuntu。

答案4

制作一个最小的工作示例并在模拟器上运行它以了解这些概念:

printf '\364%509s\125\252' > main.img
qemu-system-x86_64 -hda main.img

这是一个非常简单的“引导加载程序”,只执行一条hlt指令。更多信息请访问:https://stackoverflow.com/a/32483545/895245

然后您可以使用以下命令在真实硬件上运行它:

sudo dd if=main.img of=/dev/sdX

并将 USB 插入计算机并从计算机启动。

当你这样做时,就会清楚地发现引导加载程序存在于永久存储磁盘(如 USB 或硬盘)上。

ROM 中保存的是启动引导加载程序的代码,称为固件(或者不太准确地说是 BIOS)。

相关内容