DOS环境下支持的最大内存是多少?

本文回顾了DOS时期如何解决640K内存限制的问题,介绍了EMS( Expanded Memory Specification)、XMS(Extended Memory Specification)和HMA(High Memory Area)等扩展内存技术,以及UMB(Upper Memory Blocks)和保留内存的利用。重点讲述了如何通过模拟和整合内存资源来适应不断增长的应用需求。

DOS 6.22 can address 640 KB (not MBytes!) of conventional memory and use upto 64 MB of extended memory via DPMI and DOS Extender or himem.sys.

(来源:https://www.zhihu.com/question/20070475

  • 基本内存 占据0~640KB地址空间。
  • 保留内存 占据640KB~1024KB地址空间。分配给显示缓冲存储器、各适配卡上的ROM和系统ROM BIOS,剩余空间可作上位内存UMB。UMB的物理存储器取自物理扩展存储器。此范围的物理RAM可作为Shadow RAM使用。
  • 上位内存(UMB) 利用保留内存中未分配使用的地址空间建立,其物理存储器由物理扩展存储器取得。UMB由EMS管理,其大小可由EMS驱动程序设定。
  • 高端内存(HMA) 扩展内存中的第一个64KB区域(1024KB~1088KB)。由HIMEM.SYS建立和管理。
  • XMS内存 符合XMS规范管理的扩展内存区。其驱动程序为HIMEM.SYS。
  • EMS内存 符合EMS规范管理的扩充内存区。其驱动程序为EMM386.EXE等。

 

1. DOS的640K内存问题

 

1980年,IBM决定进入个人电脑市场,他选择了INTEL 16位的8086/8088芯片作为PC机的CPU。8086/8088有20位地址线,能读写1M(即1024K)的内存。微软和IBM在设计DOS操作系统时,决定把这1024K内存分成两部分,其中640K留给DOS系统和DOS程序使用,其余384K内存留作其他用途,如用作显示RAM,主板BIOS等。这640K内存也被称为常规内存或基本内存,早期的DOS和DOS程序就只能在这个范围内活动,这就是日后所谓的640K内存限制。
在当时,这是个很超前的设计,因为当时PC机所瞄准的对手——采用摩托罗拉8位6502芯片为CPU的APPLE II 只能支持64K内存。所以当时比尔.盖茨说:“640K内存肯定够用的了。”
然而当越来越多软件硬件加入到PC阵营时,640K内存就开始变得捉襟见肘。DOS本身要占去50多K的内存,然后是各种设备的驱动程序(鼠标、声卡、光驱、游戏手柄等外设的驱动程序以及DOS本身的ANSI.SYS及虚拟盘驱动程序RAMDIRVE等),还有其他TSR(内存驻留)程序如各种反病毒监察软件。这些程序不仅都要争夺640K内存空间,而且还会“赖着不走”。留给其他DOS应用程序的空间大大减少。
此外DOS下的应用软件功能越来越强,需要越来越多的内存。电子表格软件LOTUS 1-2-3一出世便至少需要256K的内存;而对于外挂汉字系统,256K内存仅够16点阵显示字库;文字处理软件WPS本身至少也需要180K内存;数据库软件FOXBASE则需要400K左右的内存,WINDOWS就更别提了。PC体系当初引以自豪的640K超前设计,很快便变成了巨大的障碍。

 

2. 扩充内存EMS(Expanded Memory Specification)或LIM内存

1986年,PC机上最受欢迎的软件——电子表格LOTUS 1-2-3发售新的2.0版,很快便售出数十万份。然而在许多用户的PC机(当时286机不普及,386刚出来,最多的还是使用8088CPU的PC机)上,它无法获得足够的运行内存。焦头烂额的LOTUS只好向INTEL求援,Microsoft也随后参与一起制定了给PC机扩充内存方案:LIM规格出台,即LOTUS、INTEL和Microsoft联合订制,最终版是LIM4.0版。这是一种自带存储芯片的扩充内存控制板,插在PC机的扩展槽上,通过它可为PC机提供多达32M的调页式扩充内存,简称扩充内存(EMS)。
只能访问1M内存的8086/8088又怎么突然能够额外得到32M的内存呢?当然,CPU并不能直接访问EMS内存,使用EMS的程序也不知道这些内存到底在那里,它只知道系统中有一些能存储信息的“页”。8086/8088不是能访问1024K内存么,在那384K的保留空间里还有一些空余的空间的,扩充内存控制板就使用了384K保留内存中的64K空余内存,这64K内存被分成4个页,每页16K,这部分页称为“页框架”,EMS内存也分成一个个16K的页,总数可达2000个。使用EMS的程序最多允许同时访问4个页,当程序要访问到某个页时,内存控制板就把相应EMS页的内容复制到页框架中让程序读写,读写完后把页框架中页的内容复制回相应的EMS内存页,再把别的EMS页内容复制到页框架中让程序读写。所以LIM内存被称为“调页式扩充内存”。有点像是内存页的即时热切换。也许你觉得这样做会很麻烦,也确实麻烦,但却总比没有好。


 

3. 扩展内存XMS(Extended Memory Specification)

INTEL的后续产品80286仍是16位芯片,但其地址线增加到24位,可以访问16M内存,其1M以上的内存便称为扩展内存(XMS),为了能兼容以前的DOS程序,80286拥有两种工作模式:一种是实模式(real mode),在实模式下,286就象8086/8088一样工作,只能使用1M内存,这时DOS程序在一个“更快的”8086中运行;另一种是保护模式(protected mode),在保护模式下,80286可以使用多达16M的内存,遗憾的是,在保护模式下需要实模式的DOS程序就不能够运行了。
再后来80386是32位的芯片,地址线增加到32位,可以访问4G的内存。与286不同的是,当80386运行在保护模式的时候,它还提供一种虚拟86(V86)模式,提供相当8086的功能,需要实模式的DOS程序这时仍会发现自己在一个“8086”CPU中运行。这还使得DOS的多任务成为了可能。因此MS-DOS5.0及以后版本干脆就在386的保护模式下运行,新的DOS程序如FOXPRO也在保护模式下工作,而由80386提供的V86模式支持以前需要实模式的DOS程序。
从MS-DOS5.0开始,我们得到了一个HIMEM.SYS去统一管理XMS内存。


 

4. 高位内存HMA(High memory area)

人们惊喜地发现,当286及以后CPU的第21根地址线(a20)启动后,紧挨着前1024K内存的第一个64K区段也可以被实模式的DOS 程序(通过第20根地址线a19)直接访问,即实模式DOS程序可访问多达1088K内存。只是这64K内存不能拆分开,只可以由一个DOS程序独占,所以一般用来存放DOS的命令解释器 http://COMMAND.COM(在config.sys中通过dos=high命令指定)的常驻内存部分。于是把这64K内存从原来的XMS中划分出来,称为高位内存(HMA),将 http://COMMAND.COM放入HMA后,DOS占用的常规内存可减少50多K。


 

5. 上位内存UMB(Upper Memory Blocks)和保留内存

前面不是说过,DOS初期划分了384K的保留内存么。其实这部分内存基本上未被真正占用过,主板BIOS用自己的储存芯片,显卡上也有自己的显存……但是,为了兼容以往的DOS程序,系统还是要把一部分BIOS和显存等映射进来,这部分空间不能被其他DOS程序使用。但即便如此,整个保留内存还有将近一半的空余空间,对于实模式的DOS程序而言,这可是最后一块可开垦的区域了。
虽然8086和286理论上也有保留内存区,但实际上只有386或以上的计算机才能支持UMB。
MS-DOS5.0提供了一个Emm386.exe,可把保留内存中的空余空间收集起来组成UMB,并在config.sys中提供devicehigh命令把光驱、声卡等驱动程序装入UMB,还在命令行提供loadhigh(LH)命令把鼠标驱动等TSR程序装入UMB,从而省出更多的常规内存。现在有一些新型的DOS软件如SMARTDRV和UCDOS,CCDOS97也可以自动把自己存进UMB。
保留区还有其他一些潜力可挖,比如现在大家都用VGA了,那么保留区里划分给单显(HGA)使用的16K内存,现在完全可以拿出来充进UMB,EMM386.EXE提供了一个I(nclude)参数,可以把指定区域的保留内存划进UMB。BIOS中有一段代码是用于启动时计算机自检和加载DOS的,当计算机启动后,这部分代码占用的空间也可以腾出来。


 

6. 用XMS模拟EMS

既然80386在保护模式下能有广大的XMS,又能够运行实模式DOS程序。为什么不把XMS的一部分模拟成EMS,让需要EMS的DOS程序也沾点光呢?这不就不需要用户去另买什么扩充板了么?
确实这样做到了,EMM386.EXE 有一个RAM参数,它把保留内存中的64K空余内存划出来成为页框架,然后把EMS的“页”全部放到XMS中去,这样需要EMS的DOS程序就能够得到EMS了,而且对于使用EMS的程序来说和以前并没有什么不同,在XMS中模拟出来的EMS比真正的EMS还要快。不过这也是使得许多人搞不清XMS和EMS区别的原因。
如果用户确实不需要EMS(毕竟新的DOS程序都不使用EMS而转用XMS),可以加载EMM386.EXE时加NOEMS参数,这样系统就不提供EMS,也就不需要页框架,可以多64K的UMB可用。




 

7. WINDOWS对应的内存管理

WINDOWS 1.x/2.x/3.x 总的来说,它支持三种模式,实模式对应DOS的8086实模式;标准模式对应286的16位保护模式;增强模式对应于386的32位保护模式,其中标准模式和增强模式需要HIMEM.SYS的支持,即支持XMS。
WINDOWS95/98/ME 都使用386的32位保护模式,但是不再需要用户在CONFIG.SYS中指定加载HIMEM.SYS,它们在启动时会自动加载HIMEM.SYS。WINME的系统文件IO.SYS甚至把HIMEM.SYS也包含了进去。
WINDOWSNT/2000/XP/2003 它们工作在386的32位保护模式,但它们在OS/2的基础上发展而来,不再以DOS为支持系统,以上的内存模式对它们不适用。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值