CPU的复位向量地址——在这种情况下为FFFF0h——是通过硬件设计固定的。它是CPU规格的一部分。CPU前往那个地址,获取那里发现的任何地址,跳转到那个地址,并开始执行。它是一种双重间接引用,具有固定的第一步(CPU转到地址FFFF0h,这很可能是某种ROM中的地址),以及依赖于机器的第二步。在PC上,该向量将指向BIOS中的早期初始化代码,该代码开始启动过程,但更普遍地,原则上可以是可以映射到该地址的任何硬件内存,但99.9%的时间,它都是某种ROM(PROM、EPROM、EEPROM等)。例如,假设一个32位地址空间的CPU的设计规格是,在冷启动(电源开启)向量为0xffff4,复位向量为0xffff0,并且意图是底部1MiB(0x00000至0xfffff)保留用于ROM引导代码。假设您购买了一块带有插座的板子,可插入一个1MiB的ROM,该ROM被映射到该地址空间。然后,您为该机器编写ROM BIOS,大约是半兆字节,经过编译器和汇编器的调整后,您得到一个目标代码文件,在该文件中,您想要在通电时运行的第一个代码位于偏移0x1230字节处,其中进行了一些超基本的设置,然后跳转到文件中偏移0x3210的位置,从那里可以足够启动热启动或复位。在这种情况下,您会将目标代码文件填充到1MiB,确保值0x00003210位于偏移0x000ffff0处,值0x00001230位于偏移0x000ffff4处。你需要将文件烧录到兼容的ROM中,从地址0x0开始,以便文件偏移直接转换为地址范围在0x00000000至0x000fffff之间。当计算机开机时,它会立即转到地址0x000ffff4,并在那里找到值0x00001230,将该值加载到指令指针(或程序计数器,随你怎么称呼)中,并从地址0x00001230开始执行,这是你的冷启动代码所在的位置。CPU知道自己是否已被重置或完全关闭然后再重新打开。如果CPU被重置(例如通过三次错误故障),则不会前往地址0x000ffff4,而是转到其重置向量,即0x000ffff0,加载值0x00003210并开始执行。这基本上是PC在重新启动时跳过POST的方式,但在完全关闭并重新打开时不会跳过POST。它有不同的向量,具体取决于它是“冷”还是“热”。实际上,现代CPU几乎肯定会在接近地址和数据总线之前执行一堆微代码来获取重置或引导向量。这些微代码很可能可上传到CPU中,但在架构层面上这并不改变基本思路,“向量化”就像这样是一种非常古老的方法,起源于重置地址包含等效于“跳转到地址0x01230”的指令(在非向量CPU上),实际上是手动执行“向量化”。
重置向量与固件一起存储在闪存中。重置向量编译到固件中,并位于其末尾。从Advanced x86: Introduction to BIOS & SMM Internals - Reset Vector的第15页幻灯片上可以看到: 如果我们倾倒BIOS并在十六进制编辑器中查看它,则文件末尾将会看到跳转指令(近跳转)。 芯片组使闪存对齐,以便BIOS区域的限制(始终是闪存上的唯一/最后一个区域)与地址FFFF_FFF0h对齐。 在EDK2中,您可以在此处查看重置向量的汇编代码。