内存管理及优化 上位内存的设置 上位内存（UMBs）主要用于加载TSR程序和设备驱动程序。 1．在上位内存中加载TSR程序 MS－DOS提供的许多TSR程序（如APPEND．EXE。KEYB．COM）或一般的TSR程序（UCDOS中的RD16．COM、KNL．COM、RDPS．COM、鼠标器驱动程序MOUSE．COM等）都可以用LOADHIGH或LH命令加载到上位内存中，从而节省常规内存。
要创建上位内存（UMBs），且通过LOADHIGH命令加载TSR程序到该内存中，CONFIG．SYS文件中必须有以下三行命令：
DEVICE＝C：＼DOS＼SIMEM．SYS
DRVICE＝C：＼DOS＼EMM386．EXE RAM VERBOSE
DOS＝HIGH，UMB
注意：若只有前两行，EMM386．EXE只创建XMS UMBs（XMS式的上位内存），此时，不能用LH命令加载TSR程序到上位内存中。用MEM命令查看内存，将看到Upper Memory一行均为0。只有加入DOS=UMB命令，才能将XMS UMBs转换为DOS UMBs，并可用LH命令加载TSR程序到上位内存。
2．在上位内存中加载设备驱动程序
除了DEVICE＝C：＼DOS＼HIMEM.SYS和DEVICE＝C：＼DOS＼EMM386．EXE两行外，可将CONFIG．SYS文件中的所有DEVICE改为DEVICEHIGH，DEVICEHIGH命令将“=”后面的设备驱动程序加载到上位内存，前提是上位内存必须够用。对于占用内存较多的设备驱动程序（如DBLSPACE压缩盘程序DBLSPACE．SYS、光驱驱动程序NECIDE.SYS等）更应这样做。
3．MS-DOS 7．0中带HIGH后缀的命令
MSDOS 7．0为了最大程度地节省常规内存，提供了一系列带有HIGH后缀的命令，这些命令把原来占有用常规内存的数据移到上位内存中。这些命令有：FILESHIGH、BUFFERSHIGH、INSTALLHIGH、STACKESHIGH、FCBSHIGH。在CONFIG SYS文件中设置了“DOS＝AUTO”后，原来的这些命令都变为带有HIGH后缀的命令，如FILES＝20改为FILESHIGH＝20。
获取最大的上位内存
在内存配置中，上位内存越多越好，这样，就可加载更多的设备驱动程序或TSR程序到上位内存中。下面介绍获得最大上位内存的方法。
先介绍640KB～1024KB这段保留内存的组成结构。
在640KB常规内存后面的384KB地址空间是为系统使用而保留的。在其中能找到ROM BIOS和视频RAM。该系统区的第一个地址是A000H。系统区被分割成24段，每段16KB。
A000H～B000H区域被用作设置EGA或VGA显卡的RAM，其它显示卡则使用B000H～CC00H的区域来设置它们的ROM及其影子内存。
PC机通常需要保留的系统区为：彩色图形数据区A000～AFFF（64KB）、文本缓冲区B000～BFFF（64KB）和VGA BIOS区C000～C7FF（32KB），共160KB。F000～FFFF为存放了ROM BIOS程序代码的ROM BIOS区，要获得最大上位内存，除了充分利用640KB～1024KB之间的未用区域外，还须根据PC机的显示适配器类型（是彩色EGA／VGA还是单色Herclues）等将部分系统区域转换成UMBs。下面我们进行具体的介绍。
在CONFIG．SYS中加人以下两行；
DEVICE＝C：＼DOS＼HIMEM．SYS
DEVICE＝C：＼DOS＼EM386.EXE RAM 256
则产生了：
·64KB的高端内存（HMA），可通过DOS＝HIGH将DOS的核心部分移人HMA。
·256KB扩充内存（EMS），由需要扩充内存的应用软件使用。
·87KB上位内存（UMBS），可把TSR或设备驱动程序加载到UMBs。
由于640KB～102KB这部分内存已有224KB被使用，所以我们的目的是充分挖掘剩下的160KB内存，使之更多地用于UMSs。
l．将EMS页框由缺省的DC00～EBFF上移到E000～EFFF，使UMBs增加4KB。
此时，CONFIG．SYS文件改为：
DEVICE＝C：＼DOS＼HIMEM．SYS
DEVICE＝：＼DOS＼EMM386．EXE 256 FRAME＝E000 VERBOSE
（或DEVICE＝C：＼DOS＼EMM386．EXE RAM 256 FRAME＝E000 RAM=C800-DFFF VERBOSE直接指定UMSs范围）
DOS＝HIHG，UMB
2．把EMS内存转换成UMBs
在EMM386．EXE后面增加NOEMS参数，可把保留给EMS页框的内存转换为UMSs，使UMSs增大64KB（实际只增加了60KB，剩下的4KB只是可用，但未能转化为UMSS）。这样，UMSS＝87KB＋4KB＝60KB＝15lKB。用MSD诊断软件中的“Memory”（启动MSD后按M键）查看640KB～1024KB间的内存分配情况下（图中标有“…”为可能使用的内存，我们将在下面将之转换为UMSs，同样，C800－C850之间的5KB内存也未能转换为UMSs，而是作为RAM区域保留起来，这也是为什么在第一种情况的下只能获得91KB的原因）。
此时，640KB～1024KB的保留内存分配图为：
此时，CONFIG．SYS改写为：
DEVICE=C：＼DOS＼HIMEM．SYS
DEVICE＝C：＼ DOS＼ EMM386．EXE NOEMS VERBOSE
DOS＝HIGH，UMB
3．前面提到EMM386．EXE在释放EMS页框时，并未释放完全，而是将EFC0～EFFF之间的4KB内存作为了“可使用的内存”，并没划分给UMSs。为此，可在EMM386．EXE后面增加I＝E000－EFFF参数，将该区域划人UMSs中，使UMSs容量到155KB。
此时，CONFIG．SYS文件为：
DEVICE＝C：＼DOS＼HIMEM.SYS
DEVICE＝C：＼DOS＼EMM386．EXE NOEMS VERBOSEI＝E000-EFFF
（或DEVICE＝C：＼DOS＼EMM386．EXE NOEMS VERBOSE RAM=C800-EFFF）
DOS＝HIGH，UMB
4．由于DOS BIOS并没有真正使用从F000开始的4KB内存，因此，我们可修改CONFIG．SYS文件，将此4KB转换为UMSs，使UMSs容量达到159KB。
DEVICE=C：＼DOS＼HIMEM．SYS
DEVICE＝C：＼DOS＼EMM386．EXE NOEMS VERBOSEI＝E000-F000
（或DEVICE＝C：＼DOS＼EMM386．EXE NOEMS VERBOSE RAM＝C800 F000）
DOS＝HIGH，UMB
5．EMM386．EXE提供了HIGHSCAN参数，该参数在扫描整个384KB内存时，将空闲不用的保留内存全转换为UMSS。其中CONFIG.SYS为：
DEVICE＝C：＼DOS＼HIMEM.SYS
DEVICE＝C：＼DOS＼EMM386.EXE NOEMS VERBOSEI=E000—F000 HIGHSCAN
（或DEVICE=C：＼DOS＼EMM386.EXE NOEMS VERBOSE RAM＝C800-F700）
DOS＝HIGH，UMB
6．若使用彩色显示适配器，则可把单显区域B00－B7EF（32KB）转换为UMSs，这样，UMSs容量将达到218KB。此时，CONFIG．SYS文件为：
DEVICE＝C：＼DOS＼HIMEM.SYS
DEVICE＝C：＼DOS＼EMM386.EXE NOEMS VERBOSEI=E000-F000 HIGHSCANI＝B000-B7FF
（或DEVICE＝C：＼DOS＼EMM386.EXE NOEMS VERBOSE RAM=C800-F7FFI＝B000-B7FF）
DOS=HIGH，UMB
把RAM推入极限的内存配置奥秘
首先，用DOS 6.X的内存优化工具MEMMAKER对内存进行自动优化，它将自动修改CONFIG.SYS和AUTOEXEC.BAT文件，并按合适的位置将所有的设备驱动程序和TSR程序装人上端内存，这样就大大地节省了常规内存。但是，要使常规内存达到最大（634KB），必须对MEMMAKER的配置文件进行微调。下面介绍五种内存配置的技巧，使RAM达到极限状态。
l．把MS－DPS系统放人高端内存
MEMMAKER除在CONFIG.SYS中加人HIMEM.SYS和EMM386.EXE命令外，还加人了DOS=UMB说明行，使EMM386.EXE创建的上位内存块（UMB）可用于装载TSR和设备驱动程序，但MEMMAKER却未必会加人DOS=HIGH说明行来把DOS移人高端内存区（HMA）。若运行MEMMAKER后，CONFIG.SYS文件只包含DOS二UMB命令而没有DOS＝HIGH，则可把DOS=UMB改为DOS=HIGH，UMB。这样，将使常规内存增加45KB或更多。
注意：应确保CONFIG.SYS中的BUFFERS设置为40或更小，否则，这些额外的RAM将被浪费，另外，剩下的HMA部分可装载DBLSPE.BIN的11KB部分内存。
2.使UMSs达到最大
作为默认设置，EMM386．EXE和MEMMAKER将把C600H～C7FFH之间任何未用空间映射成UMB RAM，但是，运行MEMMAKER后，可能仍存在未用的上位内存。在此，我们给出一种识别上位内存空区域并将其转换为可用RAM的技巧。
①运行MSD诊断程序，从主屏幕中单击“Memory”显示上位内存映射图，若图中显示出C000H～C5FFH段为空，则在“DEVICE=EMM386．EXE...”行末尾加上I＝C000－C5FF参数，将为您的系统增加24KB UMB RAM。
②若您没有在CUSTOM SETUP模式下运行MEMMAKER，或者您运行了，但对“USE MONOCHROME REGION（B000－B7FF）FOR RUNNING PROGRAMS？”，回答了NO，就为PC的视频缓冲区保存了未用的空间。要利用这一空间，对于彩色适配器，在CONFIG．SYS中的EMM386 EXE命令行后面加入开关I=B000－B7FF；对于单色视频适配器，则加人I＝B800－BFFF，这将使UMBRAM增大32KB。
3．获得EMS内存
允许EMM386．EXE仿真扩展内存（XMS）的一个坏处就是将使可用的UMB RAM空间减少64KB。这64KB被保留为EMS的页面帧，作为一个存取扩展内存的窗口。给EMM386．EXE增加FRAME＝NONE开关，它将仿真扩展内存而不会减少UMB RAM的数量，这样做的唯一缺点就是按这种方法配置的扩展内存将使许多使用EMS的应用程序不能运行，尤其是那些按扩展内存规范LIM VER3．2写的应用程序。若增加此参数能运行您的EMS应用程序，则UMSs将增加64KB，否则，须删除此参数开关。
注意：对于LIM EMS Ver4．0的扩充内存规范，以上开关参数可选用。
4．清除EMS内存
若在运行MEMMAKER时，对提示的“是否要运行使用扩展内存的程序”回答了NO，MEMMAKER将为EMM386．EXE设置NOEMS开关。这样节省了64KB上位内存，但却存在着一个隐患，即：若您使用DOS扩充程序（如AUTOCAD R 11.0～R 13.0、LOTUS 1－2－3 3．X～4．0）它们将不能运行。解决办法是：在NOEMS后面加人一个EMM386．EXE命令为这些程序保留的供虚拟控制程序接口（VCPI）使用的内存数。
在EMM386．EXE后面加人参数，使其能为那些不支持EMS内存的程序提供所需4MB的VCPI内存的命令：DEVICE＝C：＼DOS＼HIMEM．SYS NOEMS 4096
您得不到EMS内存，因此也不会失去64KB的UMB RAM，但您的VCPI程序将运行无阻。
5．最后的内存调整
若您只差那么几千字节就能把所有TSR和设备驱动程序装入高端内存，有两种方法可以为您提供所需的这几千字节的RAM。
①改变装入顺序
由于有些驱动程序在装人时需要更多的自由内存，而这部分内存远比它们安装完毕后占用的内存要多，因此，为确定最佳的装人顺序，可进入DOS目录，查找MEMMAKER.SYS文件（它是MEMMAKER在分析系统配置时生成的一个文本文件，该文件在MS－DOS 6.2以后的版本中改名为MEMMAKER.STS）。该文件的部分内容为：
[MemmakerData]；memmaker数据
State＝DONE 9713
AvailConvMenoryBeforce= 580272；优化前的数据
AutoexecBatChecksum＝24609；文件校验和
[SizeData]；程序执行大小
Command＝C：＼DOS＼SETVER．EXE
Line＝35
FinalSize＝640
MaxSize=12048
FinalUpperSizes＝0
MaxupperAizes＝0
ProgramType＝DEVICE；程序类型为设备驱动程序
Command＝dosdey
Line＝3
FinalSize＝4144
MaXsize＝6384
FinalUpperSizes＝0
MaxUpperSizes＝0
ProgramType＝PROGRAM；程序类型为命令行
用EDIT打开此文件，会看到在[SizeData]中列出的每一个TSR和设备驱动程序都标出MAXSIZE和FINAL－SIZE。在装人顺序中，把MAXSIZE和FINALSIZE具有最大差异的TSR和设备驱动程序装在前面，这样，就能装入更多的程序。
②使用EMM386.EXE的NOHI开关
若在装人最后一个TSR或驱动程序时只缺少小于5KB的UMB RAM，在EMM386.EXE命令行后增加NOHI参数，将阻止EMM386.EXE将自身的一部分装UMB RAM，这可以增加约5KB的可用UMB空间，若增加的这5KB允许您在高端装人一个40KB的TSR，则您最大可执行的程序就净增长了35KB。
（林虎）