你所说的关于引导加载程序(bootloader)在ROM和MBR中的冲突可能是因为“引导加载程序”被用来指任何能够找出最小化加载代码以使计算机执行有用操作的代码,包括多阶段引导中的每个状态。
所以,起始状态是拥有一台计算机,它是一种可编程设备,但不知道如何加载软件运行,因为它没有加载任何软件。(因此,“引导”自己从“靴带”上拉起来)。
从历史上看,这个问题有几种不同的解决方案,但现在我们从ROM中开始加载一些代码(很可能是严格的EEPROM),这足以让它查看不同的设备并依次尝试它们,直到找到一个可引导的设备。
这就是为什么许多系统会在你放入操作系统安装盘时从CD或DVD启动,否则从硬盘启动。BIOS(ROM上的代码,包括我们正在谈论的代码和其他一些低级别的启动代码)被设置为首先查看CD/DVD驱动器,然后如果找不到任何内容,则查看硬盘。调整者通常将其设置为忽略CD/DVD驱动器,除非手动请求,以免浪费时间旋转一个无法引导的磁盘。
这个ROM中的代码有时被称为"引导加载程序"。
当它知道要查看哪个驱动器时,它会查看MBR,其中包含关于主分区的信息 - 如果你甚至不知道磁盘的哪个部分是哪个分区,更不用说每个分区如何挂载了 - 以及一些带有进一步指令的代码。(顺便说一下,这就解释了为什么某些操作系统 - 如Windows - 只能安装在主分区上,这些分区的详细信息都在MBR中,而且它们的引导加载程序只读取了MBR中的分区信息,它不加载EBR来了解逻辑分区,就像它根本不存在一样)。
那段可执行代码也被称为引导加载程序。当我们需要区分它和接下来的内容时,它被称为主引导加载程序(因为除非我们自己制作BIOS,否则我们无法控制ROM部分)。
由于只有大约400字节的空间,这段代码将非常小,所以要实现任何实际功能,它会加载一些更大的代码,因为它不必受到这个限制的影响。
这段代码也被称为引导加载程序。当我们需要区分它和之前的内容时,它被称为次级引导加载程序。
如果你只有一个操作系统,或者你系统上的所有操作系统都使用兼容的引导加载程序(例如两个都使用GRUB的Linux安装),那么这段代码可能是最后阶段。它可以显示菜单(如果需要),加载内核,并将控制权交给操作系统。
在你的操作系统与引导加载程序不兼容的情况下,它可以进行链式加载。例如,如果你的机器上同时安装了Windows和Linux,GRUB选项加载Windows实际上会加载另一个仅知道Windows安装的引导加载程序,并将控制权交给它。虽然这是过程中的第三阶段,但它仍被称为“次级引导加载程序”,因为它既不知道也不关心之前运行的其他次级引导加载程序。对于使用不同类型的次级引导加载程序的Linux安装,情况也是如此。
当我们谈论Linux的“引导加载程序”时,通常并不是指ROM代码(它不是Linux的一部分,也不会因为安装Linux而改变)。当我们执行“update-grub”命令时,我们正在更改次级引导加载程序,它通常位于特定安装的/boot目录中。当我们执行“install-grub”命令时,我们不仅更改次级引导加载程序,还更改MBR中的主引导加载程序,以便它具有足够的代码来知道/boot的位置(可能在执行过程中启动软件RAID),并在自身执行时加载和执行/boot。
所以,总结一下,当你说ROM是主存储器的一部分时是错误的,因为它是独立的。(事实上,RAM被视为ROM的反义词)。你在说引导加载程序(bootloader)和MBR时是正确的,因为它们是整个过程中的两个步骤,并且有时都被称为这个名字。关于“不同的操作系统是否将其引导加载程序存储在不同的位置?”的答案是“大多数情况下是”,因为如果你安装了不兼容的次级引导加载程序,它们要么会隐藏其他引导加载程序(如果你先安装了Linux再安装Windows),要么在请求时链入其他引导加载程序(如果你解决了这种情况,或者在Windows之后安装了Linux)。但是,如果两个操作系统兼容,它们可以共享一个次级引导加载程序(例如,如果你在已经安装了相同类型的次级引导加载程序的Linux之后再安装另一个Linux,并且它能看到另一个Linux [有时候软件RAID会让事情变得复杂,并需要链入加载])。
在以ROM和RAM编程的日子里,情况就不同了。例如,在ZX Spectrum上,ROM是16kiB,并包含一个BASIC解释器,因此除了为将某些内容加载到其48kiB或128KiB(分页)RAM中提供起始点之外,还有一整套BASIC解释器的功能可供RAM中的程序使用(为什么要编写三角函数,当计算机已经在已知位置上有一个?尤其是当你只有48kiB的代码运行空间时)。这个ROM也以与RAM相同的方式可见,只是地址不同。在这种情况下,ROM与RAM一样是主存的一部分,但不可写入。如今,一旦完成引导的第一阶段,你基本上会忽略ROM。