中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-16 13:55
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 大于640K的程序在DOS中怎么运行的? 查看 1,820 回复 3
楼 主 大于640K的程序在DOS中怎么运行的? 发表于 2010-01-25 17:34 ·  中国 北京 海淀区 联通
初级用户
积分 36
发帖 12
注册 2010-01-21 17:17
UID 159186
性别 男
状态 离线
我这里有个程序大于 1M了, 很纳闷它是怎么在DOS中运行的,各位老大指点指点

[ Last edited by pkuwc on 2010-1-25 at 17:35 ]
[已使用 Gemini 解答]
Gemini 解答

结论

DOS 下运行超过 640KB 的程序依赖 扩展内存(XMS)扩充内存(EMS) 的内存管理机制,通过保护模式或实模式下的内存分页/映射实现。具体实现需依赖编译器、内存管理器的支持,且受硬件配置和 DOS 版本限制。

技术前提与限制

  1. 实模式的内存限制
    DOS 默认运行在 x86 实模式下,仅能直接访问前 1MB 内存(地址范围 0000:0000FFFF:FFFF,实际物理地址为 0x000000xFFFFF),其中前 640KB(0x000000x9FFFF)为常规内存(Conventional Memory),剩余 384KB 为保留内存(用于显存、BIOS、硬件接口等)。因此,实模式下无法直接运行超过 640KB 的程序。

  2. 扩展内存(XMS)与保护模式

    • 若程序超过 1MB,需通过 保护模式 访问扩展内存(XMS,即 1MB 以上的物理内存)。保护模式下 x86 处理器可访问 4GB 物理内存(32 位模式),但需内存管理器(如 HIMEM.SYS)和 DOS 扩展器支持。
    • 常见的 DOS 扩展器包括 DOS/4GW(由 Rational Systems 开发,广泛用于 Watcom C++ 编译的程序)、Phar Lap 386 DOS Extender 等。扩展器负责在实模式与保护模式间切换,管理内存分页,并提供 DOS 系统调用的兼容层。
  3. 扩充内存(EMS)与内存映射

    • 若程序使用扩充内存(EMS,即通过内存分页映射到保留内存的扩展内存),则需 EMS 管理器(如 EMM386.EXE)支持。EMS 将 1MB 以上的内存分成 16KB 的页帧,映射到保留内存中的 64KB 窗口(通常位于 0xA00000xBFFFF),程序通过访问该窗口间接使用扩展内存。但 EMS 主要用于数据存储,而非程序代码加载(代码需连续地址空间),因此超过 1MB 的程序较少依赖 EMS。

当年的常见误解

  • 部分用户可能误以为实模式下可通过“特殊指针”访问 1MB 以上内存,这是对实模式地址空间的误解:实模式下 FFFF:FFFF 对应的物理地址为 0xFFFF0 + 0xFFFF = 0x10FFEF,但处理器会将其截断为 20 位(即 0x0FFEF),因此无法访问 1MB 以上内存。
  • 另一个误解是将“内存扩充”(EMS)与“内存扩展”(XMS)混淆,前者依赖分页映射,后者依赖保护模式,两者的实现机制与适用场景完全不同。

后续优秀回复补充

cir2633 提到的 DPMI(DOS Protected Mode Interface)是关键背景:DPMI 是 1990 年代定义的保护模式接口标准,允许程序在 DOS 下直接使用保护模式,并通过 DPMI 服务器(如 Windows 3.x 的 WINOLDAP、DOSBox 的内置支持)与实模式 DOS 交互。Watcom C++ 和 DJGPP 正是通过 DPMI 实现保护模式编程,从而支持超过 1MB 的程序运行。

2 发表于 2010-01-25 22:14 ·  中国 北京 联通
高级用户
★★
积分 506
发帖 187
注册 2005-12-04 22:41
UID 46500
性别 男
状态 离线
高端内存。
3 发表于 2010-01-26 09:32 ·  中国 北京 联通
初级用户
积分 36
发帖 12
注册 2010-01-21 17:17
UID 159186
性别 男
状态 离线
程序中的指针有特殊的地方吗?所有指针都限制在FFFF:FFFF以下?如果说要寻址的地址超过FFFF:FFFF,那又是怎么做的呢,请指点一二
4 发表于 2010-02-04 13:03 ·  中国 北京 联通
初级用户
积分 52
发帖 23
注册 2009-12-25 15:51
UID 157317
性别 男
状态 离线
google搜索DMPI
现在watcom c++和DJGPP已经支持dos下保护模式编程了
论坛跳转: