引导加载程序存储在哪里-ROM,RAM或其他地方?


30

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

那么这个引导加载程序到底在哪里?不同的操作系统是否将其引导程序存储在不同的位置?

Answers:


43

ROM是与RAM分离的芯片。它不需要电源来保留其内容,并且最初无法进行任何修改,而是从工厂进行了硬接线。后来的PROM或可编程只读存储器代替了真正的ROM。这些芯片在出厂时是空白的,可以使用一种特殊的过程将其写入一次,该过程本质上会烧坏芯片的位,从而导致其状态发生变化。然后,将其替换为EPROM或可擦除可编程存储器。这些芯片上有一个小窗口,如果您向其中照射紫外线,则可以将其擦除,从而再次对其进行编程。然后将它们替换为EEPROM或电可擦可编程存储器。这些芯片具有擦除它们的特殊软件过程,因此可以对其进行重新编程。

主板上有某种类型的ROM芯片,用于保存固件,虽然现在已经被EFI固件取代,但在PC方面通常将其称为BIOS或基本输入输出系统。这是CPU在加电时首先开始执行的软件。所有固件都执行硬件的初始化,通常提供一些诊断输出,并为用户提供一种配置硬件的方法,然后定位并加载引导加载程序,而后者又可以定位并加载操作系统。

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

grub核心映像包含基本的grub代码,以及访问所需的任何模块(/boot/grub以便可以在其中加载其他模块)以及grub config文件,该文件描述了可以引导哪些操作系统以及在哪里可以找到它们。

在Intel Macs上使用的EFI固件已成为最新PC主板上的BIOS的替代品,它需要一个专用分区来保存引导加载程序文件,并且该固件足够智能,可以查找并加载这些文件,而不仅仅是加载并执行任何操作在磁盘的第一个扇区中。


这是摘自格伦·布鲁克肖尔(Glenn Brookshear)的《计算机科学》 的一段内容A small portion of a computer's main memory where the CPU expects to find its initial program is constructed from special nonvolatile memory cells. Such memory is known as read-only memory(ROM)据他介绍。主存储器由RAM和ROM两部分组成。我只想知道是否在主存储器的ROM部分上安装了所谓的引导程序... @Sergey
xczzhh 2012年

@xczzhh-是的,BIOS存储在ROM中,它检测分区中存在的Bootloader。安装任何操作系统后,它将在BIOS中创建条目类型的标志以检测相应的BOOTLOADER。
atenz

1
@xczzhh,不,引导加载程序位于硬盘驱动器或其他磁盘上。它与操作系统一起安装。除非您从主板制造商下载并安装更新,否则ROM永远不会改变。
psusi 2012年

EFI
改为

@SuiciDoga,不,EFI应用程序(基本上仅限于一些固件升级实用程序和引导加载程序)存储在硬盘的EFI系统分区中。NVRAM是EFI存储一些配置变量的位置,例如引导顺序。
psusi

23

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-sector。这个引导加载程序加载OS加载程序(在Ubuntu中是grub),该加载程序也驻留在硬盘(即/boot/grub/文件夹)中,并且任务是加载OS(例如Ubuntu)。

作为测试,请卸下硬盘(和所有其他启动设备),然后尝试启动。您可以进入BIOS步骤,但是在该步骤之后,您将无法启动任何程序。BIOS很可能会说“ 找不到引导设备 ”或“ 找不到操作系统 ”或类似的内容。

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


有关更多信息,您可能需要访问以下链接:

  1. http://en.wikipedia.org/wiki/只读存储器
  2. http://en.wikipedia.org/wiki/Random-access_memory

2
ROM大约十年来没有比RAM快。实际上,现代BIOS要做的第一件事就是将自身复制到RAM中,因为RAM快得多。
大卫·史瓦兹

1
@DavidSchwartz,已经十多年了。我在90年代中期使用的每个PC BIOS都可以选择隐藏RAM中的BIOS,以提高速度。
psusi 2012年

@Anwar,到主内存的链接已死。
马特

15

与x86兼容的处理器始终以所谓的“真实”模式启动,这是16位模式,具有1 MB的可寻址内存。从该地址空间中,可以将640K用于程序,并将上面的地址映射到不同的设备。

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

同样,BIOS ROM从0xF000:0000开始,因此CPU通电后,仅从该预定义地址开始逐个开始执行指令。BIOS ROM包含初始程序,该程序通过执行“开机自检”或POST来启动。从维基百科:

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

BIOS固件负责将磁盘中的第一个扇区读入内存,并将控制权传递给一个小程序,该小程序又位于该程序的特定地址处。的MBR然后引导加载程序可以开始直接加载OS(因为是与MS-DOS的情况下)或加载“第二级”,其不限于单个磁盘扇区的界限。

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

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

在装有Windows的计算机上安装Ubuntu时,GRUB将安装到MBR中,并且您将能够引导Ubuntu和Windows。

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


我想他想知道Windows引导程序和GRUB是否可以并存。UEFI,GPT磁盘不使用MBR,这对它们有何影响?
乌里埃雷拉(Uri Herrera)

BIOS ROM位于F000:段中,该段仅不到1 MB。640k来自A000:下的网段,可供实模式OS和程序使用。
psusi 2012年

@psusi:您是对的,我重新措辞了这一部分
谢尔盖(Sergey)

谢谢你的回答。您是说要引导一个操作系统涉及多个引导程序(一个在BIOS中,另一个在MBR中?)?对我来说是新的... :)
xczzhh 2012年

@xczzhh好吧,好的,BIOS中的代码不称为“ bootloader”,而是存储在磁盘上的代码。我更新了我的答案以使其更加清楚。
谢尔盖(Sergey)2012年

4

关于Bootloader位于ROM和MBR中的说法之间的冲突,可能是由于Bootloader被用于任何代码,该代码确定了如何执行最小加载代码以使计算机做有用的事情,包括每个代码。状态在多阶段启动中。

因此,开始状态是拥有一台计算机,这是一台可编程设备,但是不知道如何加载软件才能运行,因为它没有加载任何软件。(从而引导拉本身从它白手起家起来)。

从历史上看,有几种不同的解决方案可以解决此问题,但如今,我们从ROM中的一些代码开始(通常很可能是严格的EEPROM),足以让它查看不同的设备并依次尝试直到找到一个合适的代码为止。可启动。

(这就是为什么如果您将OS安装程序磁盘放入硬盘驱动器或从硬盘驱动器插入,则许多系统将从CD或DVD引导的原因,否则,BIOS [ROM上的代码,包括我们正在谈论的代码以及其他一些低代码。级别的东西开始]设置为首先查看CD / DVD驱动器,然后在硬盘上找到任何东西,调整程序通常将其设置为忽略CD / DVD驱动器,除非手动请求,否则不会浪费时间来整理驱动器中剩余的不可引导磁盘)。

ROM中的此代码有时称为引导加载程序

当知道要查看的驱动器时,它将查看MBR,其中包含有关主要分区的信息-如果您什至不知道,以后如何查看/或/ boot或C:/(在Windows系统上)知道磁盘的哪个部分是哪个分区,没关系每个分区如何安装?-以及一些带有进一步执行指令的代码。(顺便说一句,这解释了为什么某些操作系统(如Windows)只能安装在主分区上,这些分区的详细信息位于MBR中,这是它们的引导加载程序已读取的唯一分区信息,并且不会将EBR加载到了解逻辑分区,就这些分区而言甚至还不存在)。

该可执行代码称为bootloader。当我们要区分这和接下来要做什么时,它称为主引导加载程序(因为除非创建自己的BIOS,否则我们将忽略ROM位,因为这超出了我们的控制范围)。

该代码将非常小,因为它只能容纳约400个字节,因此要执行任何实际操作,它将加载更多代码,由于无需处理此约束,因此代码可能更大。

此代码称为bootloader。当我们要区分这和以前发生的事情时,它称为辅助引导加载程序

该代码可能是该过程的最后阶段。如果您只有一个操作系统,或者系统上的所有操作系统都使用兼容的引导加载程序(例如,两个都使用GRUB的Linux安装程序,那么最后更新的GRUB都可以引导到其中任何一个)显示菜单(如果需要)在内核中加载,并通过操作系统进行控制。

如果您的操作系统与该引导加载程序不兼容,则它可能会连锁加载。例如,如果您在同一台计算机上装有Windows和Linux,则用于加载Windows的GRUB选项实际上将加载另一个仅知道Windows安装的引导加载程序,并将其传递给它。虽然这是该过程的第三阶段,但仍称为辅助引导加载程序,因为它既不知道也不在乎之前是否有另一个辅助引导加载程序在运行。对于使用不同类型的辅助引导加载程序的Linux安装,情况也是如此。

通常,当我们用Linux来谈论引导加载程序时,通常并不是指ROM代码(它不是Linux的一部分,或者通过安装Linux进行了更改)。完成后,update-grub我们将更改辅助引导加载程序,该引导加载程序通常位于特定安装的/ boot中。当我们这样做时,install-grub我们将对其进行更改,并同时更改MBR中的主引导程序,以便它具有足够的代码来知道/ boot的位置(可能随其启动软件RAID),并在其自身执行时加载并执行该代码。 。

因此,总而言之,当您说ROM是主存储器*的一部分时,您是错误的,因为它是独立的。(实际上,RAM被视为与ROM同义)。您说那里和MBR中都有一个引导程序是正确的,因为它们是过程的两个步骤,而且有时都用该名称来调用。答案是“不同的操作系统是否将引导加载程序存储在不同的位置?” 是“主要”,因为如果不兼容,辅助引导加载程序将隐藏其他引导加载程序(如果在安装Linux之后安装Windows)或在请求时将链加载到另一个引导加载程序(如果您解决了这种情况,或者在Windows之后安装Linux)可以共享一个辅助引导加载程序(如果它们兼容的话)(如果您在另一个使用相同类型的辅助引导加载程序的Linux之后安装Linux,并且可以看到另一个Linux [有时软件RAID会使事情变得混乱,并且需要进行链加载)。

*在人们会以编程方式同时使用ROM和RAM的日子里,情况有所不同。例如,在ZX Spectrum上,ROM将为16kiB,并包含一个BASIC解释器,从而为您提供了将某些内容加载到其48kiB或128KiB(分页)或RAM中的起点(在这种情况下,它实际上是在引导进入该BASIC解释器,然后使用它来引导到磁带上的内容),则RAM中的程序可以使用BASIC解释器的一大堆功能(为什么当计算机已经在已知位置有一个函数时编写一个trig函数) ?尤其是当您只有48kiB的代码可以运行时)。此ROM的显示方式与RAM相同,只是地址不同。在这种情况下,ROM与RAM一样是主存储器的一部分,但不可写。


0

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

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

这是一个超级简单的“ bootloader”,它只执行一条hlt指令。有关更多信息,访问:https//stackoverflow.com/a/32483545/895245

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

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

并将USB插入计算机,然后从中启动。

当您执行此操作时,很明显,引导加载程序位于USB或硬盘之类的永久存储磁盘上。

ROM上存在的代码是为我们启动引导加载程序的代码,称为固件(或更确切地说是BIOS)。


0

在过去的日子里,启动程序驻留在打孔纸带上,类似于电报机或打孔卡介质所使用的那样(不再看到它们两者)。该过程以前称为IPL,是“初始程序加载”的缩写。有时,如果没有纸带或读卡器,则需要通过前面板上的控制台将二进制IPL代码直接输入到处理器中。!

如今,IPL代码驻留在pROM中,当依次执行该pROM时,它们会加载并执行为加载(引导)所需操作系统而定制的任何辅助引导加载程序。辅助加载程序可以位于IPL代码已知或可寻址的设置的任何部分的任何介质上。


-1

引导加载程序通常位于硬盘驱动器的第一扇区,通常称为主引导记录。

干杯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.