11

来自维基百科:8086 处理器的复位向量位于地址 FFFF0h 复位向量存储在哪里?

4

2 回答 2

18

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,也就是说,大约半兆,摆弄你的编译器和汇编器的结果是你最终得到一个目标代码文件,其中你想要的第一个代码run on power-on 是文件中的 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”的指令,有效地手动执行“向量化”。

于 2014-03-10T22:32:20.163 回答
3

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

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

在 EDK2 中,您可以在此处查看重置向量的汇编代码。

于 2020-08-10T09:34:16.260 回答