gpt4 book ai didi

embedded - BIOS ROM 如何映射到 PC 上的地址空间?

转载 作者:行者123 更新时间:2023-12-04 00:53:14 25 4
gpt4 key购买 nike

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

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

最佳答案

在 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) 或 240-52 字节(在支持 64 位的奔腾级 CPU 上),如果是这种情况,如果忽略物理地址空间中的许多高位,则可以说执行有效地从一个地址开始低于理论最大值 - 16,例如0x00FFFFF0 (i80286/i80386SX)。

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

关于embedded - BIOS ROM 如何映射到 PC 上的地址空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7804724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com