[摘抄]DOS内存的知识

DOS内存的知识


    ●基本内存 占据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等。 



    对于一直使用WINDOWS98或XP的人来说,知道自己有128M或者256M内存就足够了。因为WINDOWS95及其后的版本都无需人的干预就可以使用全部的内存,不管它有多大。然而,在DOS中,对内存的配置却是一门学问,而且需要对DOS的内存结构有一定的了解。下面,我们就先结合PC机的发展来介绍DOS内存的基本知识。
    
4.2.1 DOS的640K内存问题
    也许你听别人说过,DOS只能用640K内存,这话既对,也不全对。640K内存问题是局限过DOS发展的一个大问题,就像千年虫问题一样,是因计算机发展的早期人们未能预期它后来的高速发展而引起的。
    这要从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机(IBM PC出世前最先进的个人电脑)只能支持64K内存。所以当时比尔.盖茨说过:“640K内存肯定永远都够用的了。”
    然而当PC机受到全世界欢迎,越来越多软件硬件加入到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体系当初引以自豪的超前设计,很快便变成了巨大的障碍。

4.2.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内存被称为“调页式扩充内存”<>。这有点象《大红灯笼高高挂》,管家每天把红灯笼挂在一个门口,男主人看到红灯笼挂在那个门口便进那个门睡觉,框架页的作用相当于那个红灯笼。也许你觉得这样做会很麻烦,也确实麻烦,但却总比没有好。
    
4.2.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.2.4 高位内存HMA(High memory area)
   人们惊喜地发现,当286及以后CPU的第21根地址线(a20)启动后,紧挨着前1024K内存的第一个64K区段也可以被实模式的DOS 程序(通过第20根地址线a19)直接访问,即实模式DOS程序可访问多达1088K内存。只是这64K内存不能拆分开,只可以由一个DOS程序独占,所以一般用来存放DOS的命令解释器COMMAND.COM(在config.sys中通过dos=high命令指定)的常驻内存部分。于是把这64K内存从原来的XMS中划分出来,称为高位内存(HMA)<>,将COMMAND.COM放入HMA后,DOS占用的常规内存可减少50多K。


4.2.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的,当计算机启动后,这部分代码占用的空间也可以腾出来。

4.2.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使用了。



4.2.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为支持系统,以上的内存模式对它们不适用。

    


安装EMM386.EXE back
格式:DEVICE=C:/DOS/EMM386.EXE [ON|OFF|AUTO][Mem][Noems][RAM]
其中:OFF 表示不安装,需要时将其改为ON
AUTO 未使用扩展内存时不安装,使用时自动安装
Mem提供扩展内存数16~32000(KB),缺省值256(KB)
Noems不提供扩展内存,仅提供对UMB的访问
RAM提供扩展内存及UMB 
注:安装位置应在安装HIMEM.SYS后,使用扩展内存软件前
=================================================

HIMEM.SYS和EMM386.EXE

  DOS只能直接使用640KB的内存,即基本内存,必须依X其他内存管理程序来使用更多的内存,这两条命令就是最常用的内存管理程序。

  其中640KB到1MB之间的内存被称为高端内存,是系统保留使用的。1MB以上的内存成为扩展内存,HIMEM.SYS就是负责管理扩展内存的。

  EMM386.EXE负责管理高端内存并在扩展内存中模拟扩充内存供某些软件使用。

  因此为了使用更多的内存,配置文件中应有以下指令。

  DEVICE=C:\DOS\HIMEM.SYS

  DEVICE=C:\DOS\EMM386.EXE RAM

  需要注意的是:EMM386.EXE必须要求先安装HIMEM.SYS,因而必须确保安装HIMEM.SYS的配置命令在EMM386.EXE之前。




语法:DEVICE=EMM386.EXE RAM|NOEMS [,NOVCPI] [,I=xxxxxxxx|,X=xxxxxxxx]
/RAM ;用扩展内存来模拟扩充内存(EMS),并允许将扩展内存用作UMB装入程序或驱动。(常用)
/NOEMS ;用扩展内存来创建UMB,但不模拟EMS。可节省更多UMB供程序或驱动装入其中,但可能导致一些需要EMS的程序无法运行。(常用)
/NOVCPI ;VCPI(Virtual Control Program Interface)虚拟控制程序界面,一般指定了NOEMS也就不需要VCPI了。(不常用)
/I=xxxxxxxx|X=xxxxxxxx ;当EMM386将扩展内存映射到UMB时,用I=xxxxxxxx|X=xxxxxxxx包含或排除上位内存的特定区域。(如i=b000-b7ff,这一段区域是留给单色显示器用的)(不常用)
注意:在安装EMM386前必须先安装HIMEM。不要用HIGHSCAN或者M9之类的参数,强行扫描虽然可以多出7KUMB,但会造成不稳定。HIMEM和MEM386都无法用DEVICEHIGH装入上位UMB。

4.DOS:指定DOS是否维持与UMB的关系,是否部分装入高端内存。
语法:DOS=[HIGH|LOW][,UMB|,NOUMB][,AUTO|,NOAUTO][,SINGLE]
HIGH|LOW ;指定DOS是否将暂驻部分装入高端内存区。
UMB|NOUMB ;指定DOS是否管理由EMM386创建的UMB,只有指定也DOS=UMB才可以用DEVICEHIGH或LH将程序或驱动装入UMB。
AUTO|NOAUTO ;是否将FILES,BUFFERS等自动调入UMB。
SINGLE ;表示使用单一模式的DOS
其中,AUTO/NOAUTO和SINGLE仅用于MS-DOS 7.x中。

5.FILES=[数字] ;表示可同时打开的文件数,一般可选择20到50,如果要拷贝或解压缩大批的小文件(在安装台湾的一些游戏时经常会遇到这种情况,文件数可能有几千),可以把FILES的值设为上限值255,这样可以提高拷贝或解压缩的速度。但是要注意,如果把FILES的值设得过大会占用过多的基本内存。如果不加设定,系统缺省为FILES=8,一般FILES/FILESHIGH的设置值在30左右比较合适。
    
    有的系统配置文件里可能会出现FCBS=[数字]这条语句,它也是用于确定DOS可同时打开的文件最大数,它与FILES=[数字]的区别在于打开文件的方式不同。一些旧的应用程序会要求用FCB方式打开多个文件,这样,在CONFIG.SYS里就要使用FCBS命令。 

6.BUFFERS=[数字] ;表示设置磁盘缓冲区的数目,通常设置为20-30左右。缺省值一般为15。 
    磁盘缓冲区是一块内存区,它用于存储从磁盘读入的数据或存储写到磁盘的数据。DOS在读或写一个记录时,先检查包含那个记录的数据块是否已在磁盘缓冲区中,如果不在,就从磁盘上将该数据块读入到磁盘缓冲区中,再将此记录传送给应用程序;如果数据已在磁盘缓冲区中,则不必从磁盘上读入,而是直接把数据传送给应用程序。由于从磁盘上读取数据是相对耗时较多的操作,所以增加磁盘缓冲区可以节省很多读盘的时间。但是要注意,增加磁盘缓冲区是要占用内存的,所以,磁盘缓冲区的数值并不是设得越大越好,最佳的磁盘缓冲区数目要根据用户的机器配置和通常运行的程序类型来确定。 

7.STACK=n,s ;改变缺省的堆栈资源。通常指定9,256即可。
n ;堆栈数目
s ;每个堆栈的大小

8.BREAK=ON|OFF ;设置或关闭对Ctrl+C的检查,如关闭,则DOS只有在键盘输入、屏幕输出、打印机输出、辅助端口操作时才会检查。

9.DEVICE和DEVICEHIGH ;加载一些内存驻留程序,用于管理设备。比如内存管理程序和光驱驱动程序等。 如:DEVICE=HIMEM.SYS  DEVICEHIGH=VIDE-DD.SYS /D:MSCD001(光驱驱动)
DEVICEHIGH与DEVICE的不同是前者将程序加载入高端内存。

10.LASTDRIVER=字母 ;LASTDRIVER规定用户可以访问的最大驱动器符数目,也就是DOS所能识别的最后的驱动器符(字母)。如果设定的驱动器符数目小于本机上的实际驱动器数,则此LASTDRIVER命令会被忽略掉。缺省的最大驱动器符数目为本机的实际驱动器数目加一。 

11.SHELL=文件名[参数] ;指定DOS 使用的命令解释程序的名称和位置。如未指定,则默认为启动盘根目录下的command.com,你也可以指定其它的文件,如4DOS.EXE等。

12.SET 变量=[变量值] ;设置DOS环境变量。

13.NUMLOCK=ON|OFF ;指定启动时NUMLOCK指定灯是否打开。

14.REM:添加注释,注释不能超过123字符。
常见的配置为:
DEVICE=HIMEM.SYS /TESTMEM:OFF
DEVICE=MEM386.EXE RAM
DOS=HIGH,UMB,AUTO
SHELL=COMMAND.COM /P /E:640
NUMLOCK=OFF
FCBS=4,0
FILES=30
BUFFERS=25,0
LASTDRIVE=32
STACKS=9,256

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值