英特尔处理器是怎样运行的?当我们打开计算机时,它会在能够加载操作系统之前经过一系列步骤。在这篇文章中,我们将看到典型的x86处理器如何启动。这是一个非常复杂且涉及的过程。我们只提出一个基本的整体结构。此外,处理器实际上采用何种路径来达到可以加载OS的状态,这取决于引导固件。
施加电源之前
让我们从BIOS芯片开始,也称为引导ROM。BIOS芯片是计算机主板上的一块硅片,它可以存储字节。它有两个我们感兴趣的特征。首先,它(或其中的一部分)是内存映射到CPU的地址空间,这意味着CPU可以像访问RAM一样访问它。特别是,CPU可以将其指令指针指向BIOS芯片内的执行代码。其次,BIOS芯片存储的字节代表CPU执行的第一个指令。BIOSchop还包含其他代码和数据。典型的BIOS包含闪存描述符(BIOS芯片的内容表),BIOS区域(要执行的第一条指令),IntelME(Intel管理引擎)和GbE(千兆以太网)。
通电时
现代英特尔芯片配备了所谓的英特尔管理引擎。只要有电源-通过电池或电源-IntelME就会出现。它执行自己的初始化,要求它读取BIOS的闪存描述符以查找IntelME区域的位置,然后从BIOS的IntelME区域读取代码和配置数据。接下来,当我们按下计算机上的电源按钮时,CPU会亮起。在多处理器系统上,始终存在一个名为BootstrapProcessor(BSP)的指定处理器。在任何一种情况下,处理器总是以所谓的16位实模式启动,其中insruction指针指向地址0xffff.fff0,即复位向量。在此初始模式下,处理器有前12个地址线被断言,因此任何地址都看起来像0xfffx.xxxx。
BIOS芯片也以这样的方式设置,即从BIOS执行的第一条指令位于处理器的物理地址0xffff.fff0。因此,处理器能够从BIOS芯片的BIOS区域执行第一条指令。该区域包含所谓的引导固件。引导固件的示例是UEFI实现,coreboot和经典BIOS。
引导固件的第一件事就是切换到32位模式。它也是“保护模式”,即打开分段,并且可以使用不同的访问权限管理处理器地址空间的各个段。然而,启动固件只有一个段,有效地关闭了分段。这称为平面模式。
早期的初始化
值得注意的是,在启动过程的这一点上,DRAM不可用。DRAM初始化是启动固件的主要目标之一。但在它初始化DRAM之前,它需要做一些准备。
微代码补丁就像CPU正常运行的补丁。英特尔不断发布针对不同CPU的微码补丁。引导固件在引导过程中很早就应用了这些补丁。处理器的一部分是所谓的sout桥接器或I/O控制器集线器(ICH)或外围控制器集线器(PCH)。ICH也有一些初步措施。例如,ICH可能包含一个看门狗定时器,可以关闭哪个DRAM正在初始化。必须首先关闭该看门狗定时器。
当然所有这些都是由某人编写的代码固件完成的。现在我们知道的大多数代码都使用堆栈。但我们已经提到DRAM尚未初始化,因此没有内存。那么这段代码是如何编写和运行的呢?答案是这是无堆栈代码。要么它是手写的x86汇编,要么就像coreboot一样,它是用C语言编写的,并使用称为ROMCC的特殊编译器进行编译,该编译器将C转换为无堆栈汇编指令。这当然有一些限制,所以ROMCC编译代码不是我们想要执行的所有内容。我们需要尽快堆叠。(欢迎转载分享)