中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 大于640K的程序在DOS中怎么运行的?
English/Chinese Fix Translation
作者:
标题: 大于640K的程序在DOS中怎么运行的? 上一主题 | 下一主题
pkuwc
初级用户





积分 36
发帖 12
注册 2010-1-21
状态 离线
『楼 主』:  大于640K的程序在DOS中怎么运行的? [已使用 LLM 解释]

我这里有个程序大于 1M了, 很纳闷它是怎么在DOS中运行的,各位老大指点指点

Last edited by pkuwc on 2010-1-25 at 17:35 ]
LLM 解释

结论

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 的程序运行。



2010-1-25 17:34
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

高端内存。


2010-1-25 22:14
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
pkuwc
初级用户





积分 36
发帖 12
注册 2010-1-21
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

程序中的指针有特殊的地方吗?所有指针都限制在FFFF:FFFF以下?如果说要寻址的地址超过FFFF:FFFF,那又是怎么做的呢,请指点一二


2010-1-26 09:32
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
cir2633
初级用户





积分 52
发帖 23
注册 2009-12-25
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

google搜索DMPI
现在watcom c++和DJGPP已经支持dos下保护模式编程了


2010-2-4 13:03
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: