x86 - 什么存储器用于存储复位向量?

标签 x86 boot bios addressing

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

最佳答案

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”的指令,有效地手动执行“向量化”。

关于x86 - 什么存储器用于存储复位向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22312428/

相关文章:

assembly - MOV AL, ' * ' 指令使用什么寻址模式

x86 - 使用 AVX2 计算 8 个 long int 的最小值

c - UEFI - ImageLoad 不工作 - 错误 = 未找到

linux - 为什么这个 int $0x10 BIOS INT 在 Linux 上不工作?

security - 更改BIOS代码/刷新BIOS

程序集 x86 标志标志

linux - GNU 汇编程序是否添加了自己的入口点?

x86-64 - UEFI一次性加载启动选项程序实现

ssh - 我可以在计算机启动期间让SSH客户端运行吗?

assembly - 没有操作系统直接运行的程序叫什么名字?