我最初看到“CPU 上电后BIOS运行的第一条指令是什么?”这个问题后的第一反应是:一个跳转指令啊。但是实际上并非如此,下面是 Intel TigerLake 平台一个BIOS ROM 末尾处的机器码:
可以看到,上电后 CPU 运行的第一条指令是 0x90(NOP)。
查看 OVMF的代码,在 \OvmfPkg\ResetVector\Ia16\ResetVectorVtf0.asm 中:
;
; The VTF signature
;
; VTF-0 means that the VTF (Volume Top File) code does not require
; any fixups.
;
vtfSignature:
DB 'V', 'T', 'F', 0
ALIGN 16
resetVector:
;
; Reset Vector
;
; This is where the processor will begin execution
;
nop
nop
jmp EarlyBspInitReal16
ALIGN 16
fourGigabytes:
同样的,第一条指令也是 NOP。
根据公众号“泰山N思维 ”的说法:
当前BIOS的头两条NOP代码没有特殊的意义,只是为了替换 wbinvd指令(机器码:0f 09,用于flush内部的Cache,并把Cache line数据写回内存)。早期CPU 第一条指令使用wbinvd指令的原因,相对比较“靠谱”的说法是:在CPU开始执行时候,虽然Cache处于Disable状态(CR0.CD),但只代表CPU Core不使用Cache(no-fill-mode),不代表Cache中没有有效的数据,通过wbinvd指令可以invalid无效化Cache中的数据;而新的CPU Invalid的操作已经由硬件执行,不再需要额外操作。后来由于wbinvd指令在某些CPU上会导致hang机问题,并且Intel新的CPU并不需要执行wbinvd指令,所以Intel使用两条nop进行了替换。
就是说这两条指令没有特殊意义,只是因为历史原因需要用2条指令来填充这里。
有兴趣的朋友不妨订阅““泰山N思维 “这个公众号。