计算机开机的时候,内存空间的分配情况如下:
00000H ~ 003FFH 是中断向量表
00400H ~ 004FFH 是BOIS数据区
00500H ~ 9FFFFH 是自由内存区
A0000H ~ BFFFFH 这段空间是视频显示区
C0000H ~ FFFFFH 是BOIS中断处理程序区。
如果要讨论RAM 和 ROM 是混合编址的问题。讨论视频显示区就可以了。
比如下面的代码:
MOV AX,0B800H
MOV ES,AX
MOV ES:[0],‘A’
MOV ES:[1],01FH
它的功能是在屏幕的(0,0)位置显示一个字符'A',颜色由01FH确定。它的执行由大致由2个过程完成:
1、CPU把'A',01f分别送到ES:[0],ES:[1]中去。
2、视频处理器读这两个字节的单元内容处理并在屏幕显示字符'A'
在执行过程中,ES:[0],ES:[1]的内容并没有备份,它被覆盖了,也就是说混合编程的RAM的内存区域没有进行移动。
还有一个就是分时享用问题,实现的方法有很多,比如通过时钟周期来控制,通过内部寄存器状态来判断.......
以前的386机,如果打开BIOS SETUP所谓的“影子内存”(里面主要有F000H开始的BIOS的映射和C000H开始的VIDEO BIOS的映射)确实会加快速度。主要反映在字符界面的显示速度上。估计一些字模被放到了主存里的缘故?
一般情况下,主板BIOS是E0000~FFFFF,128KB;显卡BIOS是C0000~C7FFF;网卡BIOS是C8000~DFFFF。
当启动中计算机的时候,一开始BIOS并不会马上把Flash ROM中的内容copy到shadow memory,CPU会执行一部分代码,我们习惯把这一段代码叫做Boot Block。之所以要把Flash ROM中的内容loaded到memory,是因为当对CPU,memory进行完initialized,由于ROM的执行速度远比RAM要低,才会把BIOS shadow到memory中去,这样可以reduce POST的时间。所以我们在OS下会发现BIOS的content会shadow到memory的最顶端,举个例子,如果你是用的32bit的XP(support 4G),你就可以在FFF00000-FFFFFFFF(对1M的BIOS而言,如果是512K地址则是FFF7FFFF-FFFFFFFF)这段memory空间找到你的BIOS的content。至于VGA card的是C0000~C7FFF,Ethernet是C8000~DFFFF,这其实只是其相应PCI或是PCIe设备的Option ROM shadow到memory空间的地址。一开是BIOS会占用顶端1M的地址空间,并在POST过程中把VGA ROM copy到C000段,把其他的PCI/e的device Option ROM shadow到D0000-EFFFF。