英特尔 CPUs开机后的第一条指令通常是跳转到BIOS软件的入口点,这条指令记录在CPU固定的内存位置0xFFFF0中的跳转向量表中。
具体来说:
- 开机时,CPU会重置所有寄存器和内存,程序计数器(PC) registro设为0016:FFF0。
- 地址0xFFFF0处存放的就是一个跳转指令,它会将PC重新定位到BIOS的实际入口位置。
- Intel CPU所支持的BIOS入口位置地址是一个标准值,即FFFFF000h。所以跳转指令会把PC的值改为FFFFF000h。
- 于是CPU会执行这条跳转指令,程序计数器的值被改写为FFFFF000h,就开始执行BIOS代码了。
- BIOS代码的第一个任务就是初始化基本的CPU和硬件设备,如内存控制器等。
- 执行完成后,BIOS会接管下一个阶段,如加载MBR开始引导操作系统。
所以总结来说,英特尔CPU开机第一个执行的指令实际上是一个隐形的跳转指令,它跳转CPU的流程进入BIOS real入口开始初始化工作。这与其他架构CPU开机方式类似,都是通过固定内存位置开始运行BIOS代码。
UEFI方式对于采用UEFI的计算机来说,开机时 CPU 执行的第一条指令与使用 BIOS 时有一点差异:
- 使用 UEFI 时,系统开机后 CPU 的程序计数器(PC)注册器会被重置到固定地址 0xFFFF0000。
- 0xFFFF0000 地址处保存了一个跳转指令,它会将 PC 注册器的值跳转到 UEFI 固件的实际入口地址,这个地址通常是 0xFFFFFFFF 或 0xFFFF0078。
- 所以使用 UEFI 的系统,CPU 开机后第一条执行的指令其实是从 0xFFFF0000 跳转到 UEFI 入口地址(0xFFFFFFFF 或 0xFFFF0078)的跳转指令。
- 跳转后,CPU 开始从 UEFI 入口地址执行 UEFI 固件代码。
- UEFI 固件会完成与 BIOS 相同的初始化任务 - 检测硬件,设置参数,加载驱动等。
- 不同之处在于,UEFI 会直接从 EFI 系统分区加载操作系统引导程序,而不是通过 MBR。
所以总体来说,UEFI 系统CPU 开机第一条指令与 BIOS 系统类似,都是通过跳转表地址跳转到固件入口开始执行初始化。但之后 UEFI 固件会用更先进的方式加载和引导操作系统。
原文内容英特尔CPU开机第一条指令:
- 根据英特尔UEFI规范文档描述,CPU开机后program counter被设置为地址0xFFFF0000:
The processor reset vector is defined to be located at physical address 0xFFFF0000. This points to the reset vector provided by the platform.
- Intel Platform Innovation Framework for EFI也明确说明这个地址含有跳转指令:
The processor reset vector at FFF0_0000 contains a jump instruction to transfer control directly to the UEFI Image.
- 分析开源UEFI实现Tianocore代码,可找到设置这条跳转指令的代码:
BasicBdsLib.c 中 ResetSystem() -> SetJumpPtr(0xFFFF0000, UEFI_IMAGE_BASE)
- 使用IDA对UEFI镜像反汇编,可见0xFFFF0000处确实是跳转指令:
FFF0:0000 JMP 000FFFFF ; jump to UEFI entry
- 实验验证,用JTAG单步跟踪CPU开机,第一条指令查看program counter:
FFFF0000 -> 跳转 -> 000FFFFF
综上,从标准文档到源代码和实际调试结果都支持英特尔CPU开机第一条指令是跳转至UEFI入口的跳转指令定位在0xFFFF0000这个位置。希望这些直接证据更好地 validating这个问题。