什么内存用于存储复位向量?

时间:2014-03-10 22:10:59

标签: x86 addressing

来自维基百科的

:8086处理器的复位向量位于地址FFFF0h 复位向量存储在哪里?

2 个答案:

答案 0 :(得分:12)

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并开始执行 EM>。这实际上是PC在重新启动时可以跳过POST的方式,但不是在关闭电源并重新启动时。它有不同的向量,取决于它是“冷”还是“暖”。

实际上,现代CPU几乎肯定会在接近地址和数据总线之前在内部执行一堆微码以获取重置或引导向量。这个微代码很可能可以上传到CPU,但这并没有改变架构层面的基本思想,像这样的“矢量化”是一种非常非常古老的做法,它源于无处不在(在非矢量CPU上) )复位地址包含相当于“跳转到地址0x01230”的指令,有效地手动执行“矢量化”。

答案 1 :(得分:1)

复位向量与固件一起存储在闪存中。复位向量被编译到固件中并且位于其末端。来自Advanced x86: Introduction to BIOS & SMM Internals - Reset Vector的幻灯片15:

  • 如果我们转储BIOS并在十六进制编辑器中查看它,则在文件末尾,我们将看到一个跳转指令(附近,相对跳转)
  • 芯片组对齐闪存,以使BIOS区域的限制(始终是闪存上的唯一/最后一个区域)与地址FFFF_FFF0h对齐

在EDK2中,您可以看到重置向量here的汇编代码。