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

11

根据维基百科,8086处理器的复位向量存储在地址FFFF0h

复位向量存储在何处?


我不确定为什么那个讽刺的回答“在地址FFFF0h处”不是正确的答案。你想知道什么? - Emmet
我想知道CPU在启动时从哪里获取其初始指令。就像处理器如何知道固件在哪里以及如何引导它一样。 另外,我并不是在挖苦,我知道维基百科可能是错误的。 - Jordan Boehm 'J.Dawg'
我觉得你不理解我所说的“Stored”的意思。没错,它在FFFF0H,但那是ROM、HDD还是其他什么呢? - Jordan Boehm 'J.Dawg'
这是ROM。请看下面我的回答。CPU在启动时不知道如何与HDD通信。它只能通过在BIOS中运行一些代码来获得这种能力,然后使其能够与有限的可引导外设通信。 - Emmet
如果你“jmp”到它,当程序计数器从这个位置执行时,它应该等同于按下重置按钮。不是初始引导(FFF40h?)。这里没有数据,只有可执行代码。 - mckenzm
2个回答

19
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上),实际上是手动执行“向量化”。

1
好的,通常它们存储在ROM、PROM、EPROM、EEPROM等中,但是难道没有指令让处理器跳转到那个地址吗?“CPU跳转到那个地址”,它是如何到达那里的呢?事情不可能自己发生!我真的很想深入了解计算机启动的过程。 - Jordan Boehm 'J.Dawg'
答案是“CPU被硬连线执行ROM中的某些指令”,但我想更深入地理解这个问题。 - Jordan Boehm 'J.Dawg'
3
CPU确实会执行此操作:CPU的设计固定了复位向量地址,因此答案是它将从地址0xFFFF0(或者根据CPU的不同而有所不同)开始执行指令,这个地址已经被硬编码到CPU中。这两个地址(0xFFFF0和它所指向的地址)通常在只读存储器(ROM)中。 - Emmet
1
没有指令将其指向0xFFFF0。当它被重置时,它总是会转到0xFFFF0。始终如此。这是CPU设计的一部分。它是CPU规格的一部分。 - Emmet
1
好的,我现在明白了,哈哈,那么他们如何将其硬连到该地址? - Jordan Boehm 'J.Dawg'
显示剩余6条评论

3
重置向量与固件一起存储在闪存中。重置向量编译到固件中,并位于其末尾。从Advanced x86: Introduction to BIOS & SMM Internals - Reset Vector的第15页幻灯片上可以看到:
  • 如果我们倾倒BIOS并在十六进制编辑器中查看它,则文件末尾将会看到跳转指令(近跳转)。
  • 芯片组使闪存对齐,以便BIOS区域的限制(始终是闪存上的唯一/最后一个区域)与地址FFFF_FFF0h对齐。
在EDK2中,您可以在此处查看重置向量的汇编代码

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接