我知道对于像 286 这样的老机器,从启动驱动器的第一个扇区加载到内存中的 0000:7C00 的前 512 个字节都是在 16 位实模式下运行的,但是现代 64 位架构又如何呢?
编辑:我猜想这个问题是错误的。引导加载程序的编写者决定使用哪种模式的汇编指令,对吗?硬件只是按照指令执行。那么我的问题应该是,Windows 7、Mac OS X(最新版本)和 64 位计算机上的 GRUB 等主要操作系统引导加载程序使用什么模式?
答案1
所有当前 x86 兼容计算机(这也包括 x64 架构,包括 Intel 和 AMD,但不包括 Itanium)都执行引导扇区代码x86实模式,与 20 多年前的原始 IBM PC 完全一样。它不是内核模式,而是原始的分段模式,没有内存保护、多任务或代码特权级别。
如果你有软盘驱动器,请将 MS-DOS(或自由DOS),然后插入今天的计算机,它将开始启动。
引导代码的任务是切换到保护模式、设置内存保护等。所以你的猜测部分正确。引导加载程序以 x86 实模式开始执行,然后切换到保护模式,加载并开始在“内核”(ring 0) 模式下实际执行 OS 内核。
欲了解更多信息,您可以访问维基百科文章Windows NT 启动过程,其中有关于此主题的相当多的细节。
答案2
那么现代 64 位架构又如何呢?
这取决于具有现代 64 位架构的现代 64 位机器上的固件。 haimg
的答案对于 x86 世界来说是五到六年前的情况,但对于今天的 x86 世界来说已经过时了。
旧 PC/AT 固件
其中一些现代 64 位机器具有旧式 PC/AT 固件。如其他答案所述,它们从磁盘的扇区 #0 加载并运行引导程序,其方式与 PC/AT 几乎相同。 这是旧的 PC/AT 引导过程。
新的 EFI 固件
其他现代 64 位机器有新的 EFI 固件。它们不会从磁盘的扇区 #0 加载引导程序根本。它们由 EFI Boot Manager 引导,加载并运行EFI 引导加载程序应用程序.此类程序以保护模式运行。 这就是 EFI 引导过程。
EFI 固件通常在退出处理器重置后几条指令内切换到保护模式。切换到保护模式是在 EFI 固件初始化的所谓“SEC 阶段”早期完成的。从技术上讲,32 位及更高版本的 x86 处理器甚至不会以真正的实模式启动,而是以俗称的虚幻模式(寄存器的初始段描述符CS
没有描述传统的实模式映射,这就是让它变得“不真实”的原因。)
因此,可以说这些 EFI 系统永远不会进入实模式恰当的当原生引导至 EFI 引导加载程序时(即当它们不使用兼容性支持模块),因为它们直接从虚幻模式切换到保护模式,并从此一直处于保护模式。
答案3
据我所知,启动代码总是在内核模式下运行。
首先,任何东西都不可能决定使用哪种模式,因为它是从引导扇区运行的,因为它是固件要执行的第一条指令。代码在开始运行之前无法设置哪些指令可用。因此,根据设计,引导扇区上代码可用的汇编集由体系结构预先确定。
如果为此选择了任何低特权模式,那么就不可能使用来自高特权模式的指令,这几乎迫使引导代码以可用的最高特权模式运行。
答案4
Intel 手册第 3 卷系统编程指南 325384-053US 2015 年 1 月:
2.2 操作模式
上电或复位后,处理器进入实地址模式。
只是为了好玩,手册里有一张漂亮的图表:
GRUB 以保护模式启动多重引导操作系统。多重引导规范 0.6.96 机器状态:
必须设置‘CR0’位 0 (PE)。
不确定 GRUB 和 x86_64。