中国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 解释

1. 内存扩展技术 - EMS(扩展内存规范)

  • 背景
    • 在早期DOS环境下,常规内存(640KB - 1MB之间的内存当时被视为高端内存,但实际可利用情况有限)不足以容纳大于1MB的程序。EMS(Expanded Memory Specification)扩展内存规范应运而生。EMS内存是通过软件驱动程序来管理的扩展内存。
  • 原理
    • 首先,系统中有一个EMS驱动程序,例如HIMEM.SYS等。它会将扩展内存模拟成扩展内存块(EMS page frame)。程序可以通过调用EMS的相关接口来访问扩展内存。例如,程序可以使用EMS的内存分页机制,将程序的数据和代码分页存储在扩展内存中,然后在需要的时候通过分页操作来切换不同的内存页到常规内存的某个区域,从而实现对大于1MB程序的运行支持。例如,程序可以将自己的一部分代码或数据放在扩展内存的某一页中,当需要执行该部分代码时,驱动程序会将对应的页加载到常规内存的特定位置,然后进行执行。

2. 内存扩展技术 - XMS(扩展内存规范)

  • 背景
    • XMS(Extended Memory Specification)是另一种扩展内存管理规范,它比EMS更高效。
  • 原理
    • XMS驱动程序(如Emm386.exe等)会管理扩展内存。程序可以通过调用XMS的接口来访问扩展内存。XMS将扩展内存视为一个线性的内存空间。程序可以通过分配和锁定内存块等操作来使用扩展内存。例如,程序可以向XMS驱动程序申请一块大于640KB的内存块,然后将程序的部分数据或代码存储在这个内存块中,在运行时通过XMS驱动程序提供的功能来访问这些数据和代码。XMS的访问速度相对EMS更快,因为它的内存管理机制更高效。

3. 实模式下的内存分段与分页思想的变通

  • 背景
    • 在DOS的实模式下(8086系列处理器的工作模式),内存管理是基于分段的,常规内存是1MB,分段机制下段寄存器和偏移地址组合可以访问的最大内存是1MB。但通过一些巧妙的设计,程序可以利用扩展内存来突破这个限制。
  • 原理
    • 程序可以将自己的不同部分分布在常规内存和扩展内存中。例如,程序的代码和数据的一部分在常规内存的某个段中,而另一部分通过EMS或XMS管理的扩展内存来存储。程序在运行时,通过软件调度,当需要访问扩展内存中的数据或代码时,通过调用内存管理驱动程序提供的接口来进行内存的切换和访问。比如,程序可以维护一个内存映射表,记录哪些部分在常规内存,哪些部分在扩展内存,当执行到需要扩展内存中的代码时,先通过驱动程序将扩展内存中的对应部分加载到常规内存的合适位置,然后再进行执行。

总之,在DOS中运行大于1MB的程序主要是通过利用EMS和XMS等扩展内存管理规范,借助相应的内存管理驱动程序来实现对扩展内存的访问和利用,从而让程序能够在有限的常规内存(1MB以内)基础上运行超过1MB的程序。

; 以下是一个简单的示例,假设使用EMS接口来访问扩展内存,但实际编写完整的EMS调用代码较为复杂,这里仅示意相关思路
; 首先需要包含EMS相关的头文件等,这里简化处理

section.data
    ; 假设定义一些数据,可能部分数据会存放在扩展内存中
    my_data db 100 dup(0)

section.text
    org 100h ; DOS程序的起始偏移地址
start:
    ; 初始化EMS驱动程序相关操作(实际需要调用正确的EMS API)
    ; 这里只是示意如何开始访问扩展内存相关操作
    ; 例如,申请扩展内存页等操作
    ; 然后将my_data的部分数据存储到扩展内存中
    ; 后续访问数据时,通过EMS接口进行分页切换等操作
    hlt ; 暂停程序执行,实际应替换为正常的程序逻辑

上述示例代码只是非常简化的示意,实际要在DOS中让大于1MB的程序运行,需要更复杂和准确地调用EMS或XMS的API来进行扩展内存的管理和程序的内存布局操作。



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
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

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


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



论坛跳转: