在这个问题中,我考虑了 Windows (BOOTMGR) 和 Linux (GRUB) 引导加载程序以及 BIOS 和 EFI 模式。一旦引导加载程序调用了内核,引导加载程序是否会以某种方式继续运行,还是会因正在运行的操作系统而终止运行?
答案1
大多数情况下,它们不会。加载内核后,引导加载程序将完全控制权移交给它,引导加载程序的代码变为非活动状态,其内存可以由内核回收。这种机制称为链式加载。
但是,有些启动实用程序即使在内核加载后也会为自己保留内存。此类工具的一个例子是记忆磁盘,它可将内存中的磁盘映像呈现为操作系统可用的虚拟磁盘驱动器。要执行其功能,MEMDISK 不仅要为磁盘映像本身保留内存,还要为拦截执行磁盘 I/O 的固件调用的代码保留内存。大多数其他此类工具都属于这种性质:例如,有一种工具可以从 USB 磁盘启动,而 BIOS 本身并不提供此功能,它同样通过拦截磁盘 I/O 调用来实现。但即使在这种情况下,此类工具的代码也只有在操作系统专门调用它(或者准确地说,该工具模拟的固件服务)时才会执行,而不能自行激活。
原则上,没有什么可以阻止引导加载程序代码在操作系统内核加载后发挥更积极的作用,除非这样做可能需要引导加载程序和内核之间进行复杂的安排,此时将这种软件称为“引导加载程序”而不是内核的一个组成部分就变得毫无意义了。
答案2
引导加载程序是否以任何方式继续运行
不会,引导程序将系统的完全控制权移交给它加载的程序/内核。
如果 CPU 是多核的,则只会启用一个内核,并且引导过程是单线程的。
因此,一旦引导程序跳转到它加载的程序/内核,它就会停止执行。
引导代码、堆栈和数据都可能随时被覆盖,因此无法以任何方式保证引导程序的恢复。