Hotdry.
systems

DOS 内存链管理:常规块链、UMB 链接与 EMS/XMS 分页

详解 DOS 实模式下 1MB 常规内存 MCB 链管理、DOS 5+ UMB 通过 LOADHIGH 链接,以及 EMS/XMS 分页扩展的工程参数与配置清单。

在 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 视硬件。

落地清单:

  1. 探内存:MEM /F 自由,CHKDSK 链完整。
  2. CONFIG.SYS 序:HIMEM → DOS=HIGH,UMB → EMM386 → [驱动 LH]。
  3. TSR 策略:last fit 置 UMB,best fit 常规防碎。
  4. EMS/XMS 阈值:EMS 页 >4KB 数据才值,XMS 块 >64KB 减调用。
  5. 监控 / 调试:? EMS 页数,XMSDUMP handle,碎片 <10% 警。

此机制虽古,启发现代虚拟内存分页与 slab alloc。实测 386/4MB 下,UMB+EMS 释 500+KB 常规,提升多任务 20-30%。

资料来源

(正文字数:约 1250 字)

查看归档