【问题标题】:What memory is used for storing the reset vector?什么存储器用于存储复位向量?
【发布时间】:2014-04-14 06:43:11
【问题描述】:

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

【问题讨论】:

  • 我不确定为什么“在地址 FFFF0h”这个尖刻的答案不是正确答案。你想知道什么?
  • 我想知道 cpu 在启动时从哪里得到它的初始指令。就像处理器如何知道固件在哪里以及如何启动它一样。我也没有刻薄,我知道维基百科可能是错误的。
  • 我想你不明白我所说的“存储”是什么意思。正确的。它在 FFFF0H 但那是 ROM、HDD 等吗??
  • 这是 ROM。请看下面我的回答。 CPU 不知道如何在启动时与 HDD 通信。它只能通过在 BIOS 中运行一些代码来获得该功能,然后使其能够与一组有限的可启动外围设备通信。
  • 如果你“jmp”到它,当程序计数器从这个位置执行时,它应该相当于按下重置按钮。不是初始启动(FFF40h ?)。这里没有数据,是可执行代码。

标签: x86 boot bios addressing


【解决方案1】:

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 reset(例如通过三重故障),那么它不会去地址 0x000ffff4,而是去它的复位向量 0x000ffff0,加载值 0x00003210 并开始执行 那个时间>。这本质上是 PC 在重新启动时可以跳过 POST 的方式,但在它关闭并重新打开时不能。它有不同的向量,具体取决于它是“冷”还是“暖”。

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

【讨论】:

  • 好的,所以它通常在 ROM、PROM EPROM、EEPROM 等中,但没有让处理器转到该地址的指令。 “CPU 去那个地址”,它是怎么去那里的?事情不会自己发生!我真的想深入了解计算机如何启动。
  • 答案会是“cpu 是硬连线的,只执行 ROM 中的一些指令”吗?我想真正掌握的不仅仅是这些。
  • CPUdoes只是去那里:复位向量地址是CPU设计固定的,所以答案很难- 连接到 CPU 以开始从地址 0xFFFF0 提供的地址开始执行指令(或其他任何内容,根据 CPU)。这两个地址(0xFFFF0 及其指向的任何地方)通常都在 ROM 中。
  • No 指令将其指向 0xFFFF0。它总是在复位时变为 0xFFFF0。总是。这就是 CPU 的设计方式。它是 CPU 规格的一部分。
  • 好的,我现在明白了,哈哈,现在他们如何将它硬连接到那个地址?
【解决方案2】:

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

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

在EDK2中,你可以看到复位向量here的汇编代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2021-03-28
    • 2012-02-07
    相关资源
    最近更新 更多