x86处理器如何从SPI闪存中获取第一条指令?
x86上电启动:SPI闪存指令读取的底层细节
- x86处理器上电复位后,第一条指令的固定地址是
0xFFFFFFF0(也就是常说的复位向量),这个地址被硬件直接映射到存储BIOS的SPI闪存区域——现代英特尔系统里,闪存集成在PCH里(替代了老架构的南桥)。
很多人疑惑:复位后CPU连缓存、DRAM都没初始化,也不知道SPI协议,SPI总线也没配置,怎么能从闪存里读到指令?甚至看到资料说BIOS是direct memory addressable,搞不清到底是怎么回事。
核心原因是这全靠硬件层面的透明适配,完全不需要软件干预:
- 硬件默认启动模式:CPU复位的同时,PCH里的SPI控制器会自动进入固化的启动模式——片选信号被硬件拉低使能,SPI总线直接用预设的标准时序工作,默认发送SPI读指令
0x03来读取数据。 - 地址自动转SPI命令:当CPU取指引擎把
0xFFFFFFF0放到地址总线上时,PCH的地址解码器会自动把这个内存地址转换成SPI闪存对应的物理偏移,然后生成完整的SPI读命令序列,把闪存里的指令数据读出来再返回给CPU。整个过程CPU完全感知不到SPI协议的存在,就跟读普通内存一样。 - 关于
direct memory addressable:这里说的不是原地执行(SPI闪存本身没法直接跑代码),而是指CPU可以用普通的内存访问指令(取指、读操作)来访问闪存内容,硬件帮你处理了所有SPI协议的细节,让闪存看起来就像一段只读ROM。
至于为什么查x86手册找不到细节:因为这类启动逻辑属于平台设计的私有内容,不是x86架构的通用规范。CPU手册只会定义复位后要去0xFFFFFFF0取指令,但具体怎么把这个地址映射到SPI闪存、SPI控制器怎么自动工作,都是主板/PCH厂商的实现细节,不会写在公开的CPU架构手册里。
内容的提问来源于stack exchange,提问作者shivakumar
相关产品推荐
相关产品推荐

