I have a program that is over 1M, and I'm wondering how it runs in DOS. Everyone, please give me some pointers.
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的程序。
section.data
my_data db 100 dup(0)
section.text
org 100h
start:
hlt
上述示例代码只是非常简化的示意,实际要在DOS中让大于1MB的程序运行,需要更复杂和准确地调用EMS或XMS的API来进行扩展内存的管理和程序的内存布局操作。