1. 从按下电源键到第一条指令

任务目标

本案例要求梳理x86平台从按下电源键到CPU执行第一条指令(BIOS入口)的完整硬件初始化链路,重点理解两个核心概念:实模式(Real Mode)与复位向量(Reset Vector)。完成本案例后,你应能准确回答:CPU上电后处于什么模式、第一条指令从哪个地址取回、该地址为何映射到BIOS ROM。

硬件初始化流程全景

x86平台冷启动(Cold Boot)的硬件链路如下,每一步均由硬件逻辑自动完成,无需软件参与:

  1. 电源就绪:ATX电源输出Power Good信号,通知芯片组电压稳定;
  2. 复位释放:芯片组(南桥/Platform Controller Hub)向CPU的RESET#引脚发送复位脉冲,CPU内部逻辑完成初始化;
  3. 实模式进入:CPU复位后,CR0.PE被清零,处理器强制进入实模式(16位寻址,1MB地址空间,无保护);
  4. 取指复位向量:CPU将CS段寄存器设为0xF000,EIP设为0xFFF0,由此形成第一条指令的物理地址——复位向量;
  5. BIOS映射:芯片组将地址0xFFFF0(复位向量)所在的顶部64KB区域映射到BIOS ROM(非RAM),CPU从该地址取回第一条指令(一条跳转指令)。

核心概念精讲

实模式地址计算:物理地址 = 段寄存器值 × 16 + 偏移。复位后CS=0xF000,EIP=0xFFF0,因此物理地址 = 0xF000 × 16 + 0xFFF0 = 0xFFFF0。该地址距1MB地址空间顶端(0xFFFFF)仅16字节,BIOS在此放置一条JMP FAR F000:E05B指令,跳转到真正的BIOS入口代码。

为什么是0xFFFF0:x86设计时规定复位向量固定为0xFFFF0,且该区域必须是非易失性存储(ROM),因为此时DRAM控制器尚未初始化,无法访问内存。芯片组通过解码高位地址,将0xE0000~0xFFFFF(或仅顶部64KB)路由到BIOS ROM芯片。

x86冷启动:从复位到第一条指令 ① 电源就绪 Power Good信号 ② 复位释放 RESET#引脚脉冲 ③ 进入实模式 CR0.PE=0,16位寻址 ④ 取复位向量 CS=0xF000, EIP=0xFFF0 物理地址计算(实模式) 物理地址 = CS × 16 + EIP = 0xF000 × 16 + 0xFFF0 = 0xFFFF0 1MB实模式地址空间(顶部区域) 0x00000 ~ 0xDFFFF(RAM) 0xE0000~0xEFFFF 0xF0000~0xFFFFF 0xFFFF0 第一条指令(BIOS跳转) BIOS ROM映射区

验证方法

本案例为纯硬件流程分析,无代码执行。验证理解是否正确的判定标准如下:

  • 能独立推导出复位后CS与EIP的初始值,并计算出物理地址0xFFFF0;
  • 能解释为何该地址必须映射到ROM而非RAM(DRAM未初始化);
  • 能说明实模式的核心特征(20位地址线、1MB寻址上限、无保护机制);
  • 能描述BIOS第一条指令(跳转指令)的作用——将执行流引导至BIOS实际代码区。

如需进一步观察真实行为,可在QEMU中执行qemu-system-x86_64 -d int,cpu_reset -D qemu.log并查看日志中CPU初始寄存器状态,确认CS=0xF000、EIP=0xFFF0。