x86 处理器究竟如何从 SPI 闪存获取第一条指令

问题描述 投票:0回答:1

在 x86 处理器上,系统开机后,处理器通常执行的第一条指令位于

0xFFFFFFF0
,称为复位向量。通常该地址位于 BIOS 或存储 BIOS 的闪存中。

在现代系统中,我们确实看到闪存是基于 SPI 的,位于 CPU 的南桥中,现在在较新的 Intel 系统中已被 PCH 取代。

CPU启动时,只知道它的起始地址是从哪里开始的,即

0xFFFFFFF0
。当该地址通过获取引擎浮动在地址总线上时,地址解码器将其重定向到闪存,因为它映射到地址映射中的闪存区域。

我假设在这个阶段,缓存、DRAM、SSD等内存都没有初始化,CPU甚至不知道闪存的SPI协议,SPI总线也没有初始化,闪存和处理器的片选也没有启用也不知道要发送什么命令到闪存设备来获取指令。

在一些wiki/博客中,我读到的BIOS代码是

direct memory addressable
。这是否意味着就地执行?但还是要遵守SPI协议,到底是如何从SPI flash设备中获取指令的呢?

我尝试阅读相关的x86手册,很少有重置x86重置序列的博客,但他们都没有关于这方面的确切细节。

x86 cpu-architecture microcontroller intel microprocessors
1个回答
0
投票

对了,DRAM控制器没有初始化,但是Flash已经连接到芯片组南桥了。

显然CPU确实知道如何在开机状态下与南桥通信。 制造 CPU 的同一供应商也制造芯片组,并且可以定义 CPU<->芯片组通信的协议时序,以便有有效的值。 链路的任何初始化都是通过固定功能硬件和/或任何相关控制寄存器的上电默认值来完成的。

CPU 加电默认状态必须包括将该物理地址

0xFFFFFFF0
解码为“设备”地址,而不是 DRAM,因此请求会发送到芯片组。

南桥本身还必须具有通电状态,其中包括与闪存的工作 SPI 链接。 同样,任何必要的初始化都是在内部完成的,而不是由 CPU 运行代码将值插入控制寄存器。

通过南桥从闪存获取字节是 CPU 运行固件代码所需的最低功能,该固件代码设置在初始加电状态下不需要工作的任何其他功能。 (为了能够检测和测试,也许还可以通过主板上的 LED 发出错误代码信号,如果每个单独的硬件功能都需要单独执行此操作,则需要大量硬件,与在 CPU 上使用一个串行执行线程按顺序执行不同的设备,并使用一个子例程来发出各种错误信号。)

构建在特定状态下启动的逻辑门或触发器并不难。 (也许是一个弱电阻来偏置某些东西?)。 由此,您可以构建在某些默认状态下启动的硬件,例如 CPU 和芯片组之间链接的定时参数(如果完全可控的话)。

© www.soinside.com 2019 - 2024. All rights reserved.