Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded BIOS ROM如何映射到PC上的地址空间?_Embedded_X86_Cpu_Bios - Fatal编程技术网

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

Embedded BIOS ROM如何映射到PC上的地址空间?,embedded,x86,cpu,bios,Embedded,X86,Cpu,Bios,x86 CPU在物理地址0xFFFFF0处开始执行。BIOS ROM位于地址空间的末尾。CPU从ROM执行的第一条指令是远跳,这会导致CS段重新加载,因此下一条指令从物理区域0x000F0000-0x000FFFFF内执行 是什么导致ROM在两个区域上都响应?PC机上是否有特殊的地址解码逻辑?我在Bochs源代码中找到一条注释,指出最后128K的BIOS ROM映射到0xE0000-0xFFFFF。然而,我找不到更多关于这方面的信息。显然,这是PC特有的,因为我有x86嵌入式板,这样的镜像不会发

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


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

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

至于复位后CPU开始执行的初始地址,如果您查看文档,您将看到奔腾类CPU的起始地址是:
EIP=0xFFF0
CS.选择器=0xF000
CS.Base=0xFFFF0000

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

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


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

由于内存混叠,ROM对两个区域都有响应。根据Intel的Pete Dice所写的:

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


有关设备内存映射、内存初始化、配置和测试的详细信息,请参阅本文。

您看过了吗?谢谢。我特别感兴趣的是断言“除非ROM也映射到那个低位置”。那么,对于PC/AT兼容体系结构来说,ROM映射到两个位置是否总是正确的呢?@manison:CPU要求第一条指令的最大值为-16,而兼容性要求ROM BIOS代码的其余部分在1MB点以下可用(至少部分)。因此,如果这些第一条指令存储在同一个ROM中,则必须将其映射到两个不同的位置。但是,如果特定PC品牌中的第一条指令是到ROM中某个位置的远跳(例如,0xF000:0xFFF0),则硬件实现可能不提供第二个映射,而是在读取maximum-16中的内存时,简单地响应该远跳指令的字节序列。似乎Z80具有更好的设计,CPU启动时在地址0处启动,中断向量放在启动地址之后。