【问题标题】:How is the BIOS ROM mapped into address space on PC?BIOS ROM 是如何映射到 PC 上的地址空间的?
【发布时间】:2011-12-09 22:08:20
【问题描述】:

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

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

【问题讨论】:

标签: embedded x86 cpu bios


【解决方案1】:

由于内存混叠,ROM 会同时响应这两个区域。根据英特尔的 Pete Dice 所写的Dr. Dobbs article

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

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

【讨论】:

    【解决方案2】:

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

    至于 CPU 在复位后开始执行的初始地址,如果你查看文档,你会看到 Pentium 级 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(在 i80286 和 i80386SX 上)或 4GB(在i80386DX/原始 i80386 和 i80486)或 240-52 字节(在支持 64 位的奔腾级 CPU 上),如果是这种情况,如果物理地址空间中的一些高位被忽略,可以说执行有效地从低于理论最大值的地址开始 - 16,例如0x00FFFFF0 (i80286/i80386SX)。

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

    【讨论】:

    • 谢谢。我对断言“除非 ROM 也映射在那个低位置”特别感兴趣。那么对于 PC/AT 兼容架构来说,ROM 在两个位置都映射是否总是正确的?
    • @manison:CPU 要求第一条指令最多为 16 个,而兼容性要求 ROM BIOS 代码的其余部分在 1MB 点以下可用(至少,其中的某些部分) .因此,如果这些第一条指令存储在同一个 ROM 中,则它必须映射到 2 个不同的位置。但是,如果特定 PC 品牌中的第一条指令是远跳转到 ROM 中的某个位置(例如,0xF000:0xFFF0),则硬件实现可能不会提供第二个映射,而是简单地响应该远跳转指令的字节序列,当读取最大 16 的内存。
    • 好像Z80的设计更好,CPU启动时从地址0开始,中断向量放在启动地址之后。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2011-11-12
    • 2012-03-02
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多