嵌入式 – 如何将BIOS ROM映射到PC上的地址空间?

x86 CPU在物理地址0xFFFFFFF0开始执行. B IOS ROM位于地址空间的末尾. CPU从ROM执行的第一条指令是远程跳转,这导致CS段被重新加载,从而在物理区域0x000F0000 – 0x000FFFFF内执行下一条指令.

什么导致ROM在两个地区做出回应? PC上有特殊的地址解码逻辑吗?我在Bochs源代码中发现了一些注释,指出最后128K的BIOS ROM映射到0xE0000 – 0xFFFFF.但是我找不到更多关于这个的信息.显然,这是一个PC特定的,因为我有x86嵌入式板,这样的镜像不会发生在那里.我只能用近跳.

在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(如在i80386DX /原始设备上),则CPU及其周围的电路都不得支持所有32个(或更多)地址行i80386和i80486)或240-52字节(在64位Pentium级CPU上),如果是这种情况,如果物理地址空间中的一些高位被忽略,则可以说执行有效地从一个地址开始低于理论最大值16,例如0x00FFFFF0(i80286 / i80386SX).

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

相关文章
相关标签/搜索