Emm*_*met 13
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 BIOS,比如大约半个兆比特,而你的编译器和汇编器的结果就是你最终得到一个目标代码文件,你想要的第一个代码上电时运行是0x1230字节偏移到文件中,在那里你做一些超基本设置,然后跳转到文件中的偏移量0x3210,其中代码足以从热启动或重置启动.在这种情况下,您可以将对象代码文件填充到1MiB,确保值0x00003210位于偏移量0x000ffff0,值0x00001230位于偏移量0x000ffff4.
将文件刻录到从地址0x0开始的兼容ROM中,以便文件偏移直接转换为0x00000000到0x000fffff范围内的地址.当机器打开时,它立即进入地址0x000ffff4,找到值0x00001230,将该值加载到指令指针(或程序计数器,无论你想调用它),并开始执行地址0x00001230,你的冷启动代码是.
CPU知道它是否已被重置或完全关闭然后再打开.如果CPU 复位(例如,通过三次故障),那么它不会转到地址0x000ffff4,而是转到其复位向量0x000ffff0,加载值0x00003210并开始执行该操作.这实际上是PC在重新启动时可以跳过POST的方式,但不是在关闭电源并重新启动时.它有不同的向量,取决于它是"冷"还是"暖".
实际上,现代CPU几乎肯定会在接近地址和数据总线之前在内部执行一堆微码以获取复位或引导向量.这个微代码很可能可以上传到CPU,但这并没有改变架构层面的基本思想,像这样的"矢量化"是一种非常非常古老的做法,它源于无处不在(在非矢量CPU上) )复位地址包含相当于"跳转到地址0x01230"的指令,有效地手动执行"矢量化".