15

x86 CPU 从物理地址 0xFFFFFFF0 开始执行。BIOS ROM 位于地址空间的末尾。CPU 从 ROM 执行的第一条指令是远跳转,这会导致 CS 段被重新加载,因此下一条指令从物理区域 0x000F0000 - 0x000FFFFF 内执行。

是什么导致 ROM 在两个区域都响应?PC上是否有一些特殊的地址解码逻辑?我在 Bochs 源代码中找到注释,指出最后 128K 的 BIOS ROM 映射到 0xE0000 - 0xFFFFF。但是我找不到有关此的更多信息。显然,这是 PC 特有的,因为我有 x86 嵌入式板,并且这种镜像不会在那里发生。我只能使用近跳。

4

2 回答 2

18

在 PC 上,总是涉及一些地址解码逻辑,因为物理地址空间中有一些“洞/窗口”,通过这些“洞/窗口”可以访问 BIOS ROM 和 I/O 设备(例如视频卡)而不是 RAM。出于兼容性原因,这是设计使然,因此较旧的程序仍可以在较新的计算机上运行。

至于CPU在复位后开始执行的初始地址,如果你看一下文档,你会看到奔腾级CPU是这样开始的:
EIP=0xFFF0
CS.Selector=0xF000
CS.Base=0xFFFF0000

如果您遵循正常的实模式寻址方案,则物理地址应为 CS.Selector*16+IP,或者替换值后为 0xFFFF0。但是,CPU 实际使用 CS.Base+(E)IP 计算地址(在真实和 16/32 位保护模式下,而不是在虚拟 8086 或 64 位保护模式下),因此 CPU 请求的第一个地址从内存中将是 0xFFFFFFF0。您无法使用远跳转到 ROM 中那个高地址的代码可能是因为加载到 CS 中会将 CS.Base 重置为 16 * CS.Selector 的新值。因此,例如,跳转到 0xF000:0xFFF0 会将控制权转移到 0xFFFF0 而不是 0xFFFFFFF0 并且除非 ROM 也映射到内存中的那个低位置并且其中的代码适合在 CS(.Selector)=0xF000 下运行,它不会运行。

此外,如果 PC 被限制为最多 16MB(如在 i80286 和 i80386SX 上)或 4GB(如在 i80386DX/原始上),则 CPU 及其周围的电路都不必支持所有 32 个(或更多)地址线i80386 和 i80486)或 2 个40-52字节(在支持 64 位的 Pentium 级 CPU 上),如果是这种情况,如果忽略物理地址空间中的一些高位,则可以说执行有效地开始于地址低于理论最大值 - 16,例如 0x00FFFFF0 (i80286/i80386SX)。

如果您需要解决电路板的问题,请参阅其文档和原理图以了解 ROM 如何映射到其上的物理地址空间。

于 2011-10-18T10:55:55.177 回答
2

由于内存混叠,ROM 对这两个区域都有响应。根据英特尔的 Pete Dice 撰写的Dobbs 博士的这篇文章:

对于传统的选项 ROM 和 BIOS 内存范围,英特尔芯片组通常具有内存别名功能,允许访问低于 1 MB 的内存,或从位于略低于 4 GB 的 DRAM 或非易失性存储中路由。控制此别名的寄存器通常称为可编程属性映射 (PAM)。在固件镜像之前、期间和之后可能需要对这些寄存器进行操作。对内存访问重定向的控制因芯片组而异。例如,一些芯片组允许控制读取和写入,而其他芯片组只允许控制读取。

查看文章,了解有关设备内存映射和内存初始化、配置和测试的更多低级详细信息。

于 2020-08-10T07:05:15.543 回答