在 DOS 实模式环境下,8086/80286 CPU 的 20 位寻址限制物理内存访问于 1MB(0x00000-0xFFFFF),其中常规内存(conventional memory)为 0-640KB,剩余上层内存区域(UMA,640KB-1MB)常被硬件 ROM 和适配器占用。DOS 通过内存控制块(MCB,arena header)链式结构管理常规内存,支持动态分配、释放与合并,避免碎片化。该机制简单高效,适用于 TSR(Terminate-Stay-Resident)和多任务伪环境。
MCB 是每个内存块前 16 字节(1 段落,paragraph)头部,包含签名字节(0x00 为 'M' 表示有效块,'Z' 为末尾块)、所有者 PID(16 位字,0 为空闲)和大小(段落数,16 位,支持最大约 1MB)。内存链从 DOS 内部 arena_head 起始,按地址升序隐式链接:当前块结束后即下一 MCB,无指针,直接 size 推导位置。分配时,ALLOC(INT 21h AH=48h)遍历全链,合并相邻空闲块(coalescing),返回最大可用段或 AX = 段地址 / BX = 最大空闲。DEALLOC(AH=49h)仅设 owner=0,SETBLOCK(AH=4Ah)调整大小,向下永成功(释放余块),向上若失败则 BX = 最大可扩(注意:DOS 已预扩至该大小,此为 bug)。
为优化搜索,DOS 2.11+ 支持 AllocOper(INT 21h AH=58h):子功能 00h/01h 设 / 查策略(0=first fit 最低匹配,1=best fit 最小匹配,2=last fit 最高匹配);程序常双 ALLOC 先探最大(请求 FFFFh 段)。实际中,first fit 速度快,best fit 抗碎片。风险:零大小块(仅 MCB)可能出现,SETBLOCK 抢占他人块(设自身 owner),需谨慎。
DOS 5.0+ 引入 UMB(Upper Memory Blocks,UMA 空洞)链接,扩展 arena 链至 1MB。CONFIG.SYS 加 DOS=UMB 激活双 arena(常规 + 上层),INT 21h/58h 子功能 02h/03h 查 / 设链接(1 = 链接 UMB 至常规链)。分配策略扩展:80h = 常规优先,60h=UMB 先常规备,40h=UMB 专用。LOADHIGH(LH)命令或 DEVICEHIGH 加载驱动 / TSR 至 UMB:先查 LINK /? 状态,再 LH C:\DOS\HIMEM.SYS 等。需 EMM386.EXE(依 HIMEM.SYS)将扩展内存映射 UMB:典型 config:
DEVICE=C:\DOS\HIMEM.SYS /TESTMEM:OFF
DOS=HIGH,UMB
DEVICE=C:\DOS\EMM386.EXE NOEMS RAM=D X=1000-2000
此释~50-60KB 常规内存。参数:EMM386 RAM=D 置 UMB 于 D000h 段,X = 范围避 ROM;HIMEM /NUMHANDLES=64 增句柄上限。监控:MEM /C /P 列链,DOS=HIGHUMB 确 DOS 内核移 HMA(1MB 上 64KB)。回滚:若不稳,设 EMM386 NOEMS 仅 UMB 无 EMS。
突破 1MB 需 EMS/XMS 分页。EMS(LIM 3.2/4.0)用 64KB page frame(UMA 内,如 E000:0000,四 16KB 逻辑页 0-3),映射上层 expanded memory(硬件板或 EMM386 仿)。INT 67h AH=40h 得 frame 段,42h 设页映射(AL = 逻辑页,DX=expanded 页号)。示例:存大数组,分页轮换,阈值 16KB / 页,缓冲 2-3 页防换页开销。风险:frame 独占 UMB,设 FRAME=NONE 柔性但慢。
XMS(v2.0+)经 HIMEM.SYS(INT 2Fh AH=4310h 得 entry)API 管理线性扩展内存(>1MB)。关键调用:AH=00h 版本 / 09h A20 控 / 0Ah 获 HMA(DOS=HIGH 优先)。分配 AH=09h DX=Kb 请求,得 handle;移动 AH=0Bh src/dst handle/len/offset。参数:最小 1KB,句柄上限 32-128(/NUMHANDLES),/INT15=256 留旧 BIOS。XMS 复制式(非直接访问),适合 RAMDISK/SMARTDRV,速度~10-20MB/s 视硬件。
落地清单:
- 探内存:
MEM /F自由,CHKDSK链完整。 - CONFIG.SYS 序:HIMEM → DOS=HIGH,UMB → EMM386 → [驱动 LH]。
- TSR 策略:last fit 置 UMB,best fit 常规防碎。
- EMS/XMS 阈值:EMS 页 >4KB 数据才值,XMS 块 >64KB 减调用。
- 监控 / 调试:
? EMS页数,XMSDUMPhandle,碎片 <10% 警。
此机制虽古,启发现代虚拟内存分页与 slab alloc。实测 386/4MB 下,UMB+EMS 释 500+KB 常规,提升多任务 20-30%。
资料来源:
- DOS Memory Management | OS/2 Museum
- [DOS memory management - Perplexity sources](https://groups.google.com/g/comp.os.msdos.programmer/c/bkX3EW5drZg 等)
- Wikipedia/HIMEM.SYS, Vogons Wiki 等权威页。
(正文字数:约 1250 字)