LLM 解释
1M以下内存访问方案
一、前640KB(常规内存)访问
通过MCB(内存控制块)管理空闲内存是DOS环境下的标准做法:
MCB结构解析:
偏移 大小 描述
00h 1字节 状态标志 ('M'=已分配, 'Z'=空闲)
01h 2字节 段大小 (以节/paragraph为单位, 1节=16字节)
03h 8字节 程序名 (空闲块通常为' ')
0Bh n字节 内存块数据区
获取空闲块的流程:
- 从
PSP:0008h
获取第一个MCB段地址(通常为0050h
)
- 遍历MCB链(每个MCB的下一个块地址=当前MCB段地址+段大小+1)
- 检查状态标志为'Z'的空闲块
示例代码(汇编):
; 查找第一个空闲MCB
mov es, [0080h] ; PSP段地址,通常在程序段前缀
mov bx, es:[0008h] ; 获取第一个MCB段地址
next_mcb:
mov es, bx ; 指向当前MCB
cmp byte ptr es:[00h], 'Z' ; 检查是否为空闲块
je found_free_block ; 找到空闲块
mov bx, es:[01h] ; 获取段大小(节数)
add bx, es ; 计算下一个MCB地址 (当前段+大小)
inc bx ; MCB本身占1节
jmp next_mcb
found_free_block:
; es:0Bh 开始为可用内存区
二、后384KB(保留内存区)访问
640KB-1024KB区域包含:
-
VGA/视频缓冲区 (A0000h-BFFFFh)
-
ROM BIOS (C0000h-FFFFFh)
-
系统保留区 (如扩展BIOS数据区EBDA)
访问方法:
-
直接段地址访问(适用于已知区域)
; 访问VGA文本模式缓冲区 (B8000h)
mov ax, 0B800h
mov es, ax
mov di, 0 ; 屏幕左上角
mov word ptr es:[di], 0721h ; 黑底白字显示 '!'
-
使用DOS内存控制功能
- 调用
INT 21h AH=48h
分配内存(可能返回高位内存块)
- 调用
INT 15h AH=88h
获取扩展内存大小(但仅适用于1MB以上)
-
通过XMS/EMS规范(推荐用于管理高端内存)
-
XMS方法(需要HIMEM.SYS驱动):
; 获取XMS控制函数入口
mov ax, 4300h
int 2Fh
cmp al, 80h
jne no_xms
mov ax, 4310h
int 2Fh ; ES:BX = XMS驱动入口
; 分配高端内存块
mov ah, 09h ; XMS分配函数
mov dx, size ; 以KB为单位
call dword ptr es:[bx]
jc alloc_failed
mov seg_highmem, ax ; AX = 分配的段地址
-
注意事项:
- 0A0000h-0BFFFFh为视频内存,直接写入会影响显示
- 0C0000h-0FFFFFh包含ROM和系统硬件映射,随意写入可能导致崩溃
- 部分区域可能被EMS/XMS驱动占用,需通过相应API查询
三、兼容性建议
- 实模式下最大寻址空间为1MB,通过段:偏移方式访问(段×16+偏移)
- 使用调试工具如
DEBUG.EXE
验证内存映射:-d A000:0000
- 编写内存检测程序识别可用区域,避免覆盖关键系统数据
- 对于286+处理器,可通过保护模式访问更大地址空间,但需处理模式切换
建议优先使用XMS规范管理高端内存,以确保系统稳定性和兼容性。