|
扩充内存(Expanded Memory)最早出现在8086的机子上,通过专用的I/O口和DIP开关对ROM未使用的内存段进行替换。
到了EISA、PCI及更高,BIOS编写商通过桥的功能完成内存重定位把扩展内存模拟成扩充内存,扩充内存不使用1M以上的地址(A20状态对其没有影响),另外由于扩充内存地址位于UMB,放在里面的程序可以在实模式直接运行,不过当进行页面切换的时候要注意处理,防止正在运行的被切出去,另外由于技术原因只有前16M的扩展内存可被映射成扩充内存。早期的CMOS SETUP里面还有专门的设置项。PAE技术实现和此技术类似。
目前管理EMS的通常使用INT 15H、EMM386(其实就是利用BIOS的接口),config.sys里面使用UMB通常需要EMM386。EMS申请每块为16KB,BIOS进行映射时最小单位为4个连续块(即64K)
XMS则通过类似文件句柄的方法来使用扩展内存,HMA(F000:FFFF~FFFF:FFFF)属于XMS的附属品,由于XMS实际上已经使用1M以上的地址,所以A20必须打开。XMS通常用INT15H、HIMEM来驱动,DOS=HIGH属于此范畴。
蓝色的属于翻译歧义问题--扩展内存(Extended Memory)、扩充内存(Expanded Memory)反过来了(早期很多人就是反过来翻译)。
红色的也有点问题,其实内存重定位是靠桥而不是CPU来完成。PCI桥里面就有如何把某段内存映射成ROM段(DOS)的项,显卡、硬盘卡就是依靠桥来把32位地址的ROM映射到C000~F000 ROM段的替换。BIOS里面有一段16KB左右的代码就是来自最早的IBM PC机的ROM(FE000~FFFFF),后面的板卡ROM自检时再对原有的中断服务程序进行替换。
***在DOS下不推荐直接使用INT 15H来管理扩充内存和扩展内存。
EMS使用INT 67H、IN 15H(AH=40H~46H)调用,XMS用INT 2FH(AH=43H调用,AL=子功能)
[ 本帖最后由 netwinxp 于 2010-12-10 22:06 编辑 ] |
|