标题: 大文件在DOS下的执行
[打印本页]
作者: Johnham
时间: 2008-8-21 15:47
标题: 大文件在DOS下的执行
COMMAND加载大于可用常规内存的EXE时,究竟是如何装载和运行的,很多年的疑惑未得甚解,请高手解惑。
作者: DOSforever
时间: 2008-8-22 02:32
COMMAND 能加载大于可用常规内存的 EXE 文件?这个问题我还注意过,你怎么知道大于可用常规内存的?
作者: Johnham
时间: 2008-8-22 21:24
提的问题的意思是,比如一个1.2GB的单一的EXE,在DOS下,COMMAND是如何加载它的?假定程序自己没有设计模块化加载。
EMM和XMS假定是先决条件,EXE去使用EMM/XMS管理的高端内存来放置大数据是完全可行的,问题是EXE自身。
难道也被放进了1M以上,或被COMMAND分段加载了?但测试发现EXE启动后,即使移除源盘(拔除U盘),整个程序仍可完整运行到底,于是分段加载的可能行被排除。
可能行大致在于放到了1M以上,如何排放的,实在不得其解
作者: netwinxp
时间: 2008-8-25 00:33
纯DOS下执行大于常规内存的EXE文件应该会出现内存不足的提示,请不要把DOS和WINDOWS的命令行模式混为一谈。
作者: DOSforever
时间: 2008-8-25 02:51
我倒不认为他把 DOS 和 Windows 的命令行混为一谈了,什么 EMM/XMS、高端内存、1M以上,这些他都知道。不过用词和概念还是有那么些不准确。
一般而言 .exe 结构的文件分为三个段:代码段、数据段、堆栈段,堆栈段可以没有,数据段可以放在常规内存也可以放到 XMS/EMS 中去,但代码段只能在常规内存中,正因为如此所以后来才出现了像 DOS4GW 这样的 DOS Extender 。
作者: Johnham
时间: 2008-8-26 00:29
COMMAND加载EXE的时候,调用INT 21的EXEC功能把各段作重定位,假定运用了DOS EXTENDER的EXE的重定位表具有比不运用DOS EXTENDER的重定位表有更多的内容,是可以理解的,但未见文章介绍这种重定位表的内容与常规的有什么本质不同,也未见文章说从哪个DOS版本开始,COMMAND开始可以“感知”EMM/XMS的存在,高手请解惑。
不只哪位还保留有《COMMAND分析教程》,可惜当年我只买了《BIO分析教程》,愿交换共享。希望《COMMAND分析教程》里讲到了COMMAND与EMM/XMS共同作用来运行大程序,如果没有,似乎只能在DOS EXTENDER里求解了。
作者: Johnham
时间: 2008-9-3 22:02
还是想请高手进来提示一下
猜测,COMMAND装载WATCOM或DJGPP产生的使用DOS扩展器的程序时(可以大到GB),或许从重定位表里看到的是只有几个段的小EXE,比如仅几十K,控制转移到EXE后,进入保护模式,加载自己的剩余部分,跳到真正开始处,在平坦内存下运行。
这种标准头的功能,编译器可以实现,类似C0.ASM,如果是这样,则COMMAND就并不需关心这个程序真的是多大,或者说,COMMAND被欺骗了一下,并且,并不为DOS保护模式下的大程序专门做什么,一切都是EXE自己去完成的
以上仅是猜测,有分析过INT21 EXEC的请介绍下EXEC的具体作为?不知道EXEC会不会去核对EXE文件目录表的文件大小字段,如果核对,会出错
作者: netwinxp
时间: 2009-4-21 21:05
纯DOS下面,系统只管理常规内存那一块(大于1M以上的,虽然我们可以通过一些接口来访问,但DOS本身不会去管这块--DOS内存链仅包含1M以下的内存<以节为单位>),所以DOS程序大于常规内存的话就会出现内存不足的提示。通常的解决办法是——数据独立成文件,通过程序加载到扩展内存;代码段,通过OVL方式动态加载、卸载到常规内存。
作者: johnsonlam
时间: 2009-4-22 00:39
1) 舊 方 法 : Overlay - 先 載 入 一 部 份 , 需 要 時 再 載 入 其 他 , 覆 蓋 原 來 的 部 份
2) DOS Extender: 要 求 Memory Manager 取 得 XMS , 再 將 程 序 載 入 XMS 內
3) Swap: 把 一 部 份 程 序 轉 移 到 硬 盤 , EMS 或 XMS , 再 載 入 其 他, 覆 蓋 原 來 的 部 份
[
Last edited by johnsonlam on 2009-4-22 at 00:41 ]
作者: Johnham
时间: 2009-4-29 13:22
Overlay的方式好理解,EXE的特征就是一个(通常)小于640KB的EXE,是主程序,后面跟了几个巨大的OVL文件,当年的PCTOOLS就那模样,相当羡慕。
比较关注的还是DOS EXTENDER方式,试着DEBUG进一种我用的DOS32A,28K完成了实模式到平坦模式的转换然后加载用户应用,把大EXE放进了整个可用的物理内存中。
反汇编工具老了,有些32bit代码反汇编不好读起来感觉不对劲,只好作罢。90年代没有学习DOSEXTENDER,WINDOWS时代,再也没机会了。
作者: netwinxp
时间: 2009-5-2 01:43
首先MZ格式的EXE文件采用的是段:偏移量的内存访问方式,这就决定了MZ段不能超过常规内存的大小。这并不是说command.com不能运行长度大于常规内存大小的EXE文件,但是MZ的那部分不能大于常规内存大小,比如PE格式的EXE。然而对于MZ以外的那部分必须由你MZ的那部分代码来完成加载、扩展内存分配和重定位。简单地说你不可能指望DOS本身来帮你完成平坦模式的内存管理、代码重定位等内存和程序功能,你只能DIY,由你的MZ部分完成实模式向保护模式的转化、管理平坦模式内存的分配链划分和内存的分配、代码、数据的加载、堆栈的管理等等,还有中断也不能正常工作了,所以你还要整顿一下中断服务程序,还有——你可能无法回到先前的DOS状态了。如果你酱紫做那你还不如直接使用win9x,我相信你很难做得比它还好。
简单地说你想要的几乎就是一个32位的操作系统的功能,并且从DOS加载。
[
Last edited by netwinxp on 2009-5-2 at 01:45 ]