中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 大文件在DOS下的执行 上一主题 | 下一主题
Johnham
初级用户




积分 24
发帖 11
注册 2008-8-21
状态 离线
『楼 主』:  大文件在DOS下的执行

COMMAND加载大于可用常规内存的EXE时,究竟是如何装载和运行的,很多年的疑惑未得甚解,请高手解惑。

2008-8-21 15:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
DOSforever
金牌会员





积分 4633
发帖 2236
注册 2005-1-30
状态 离线
『第 2 楼』:  

COMMAND 能加载大于可用常规内存的 EXE 文件?这个问题我还注意过,你怎么知道大于可用常规内存的?



DOS倒下了,但永远不死
DOS NEVER DIES !

投票调查:
http://www.cn-dos.net/forum/viewthread.php?tid=46187

本人尚未解决的疑难问题:
http://www.cn-dos.net/forum/viewthread.php?tid=15135
http://www.cn-dos.net/forum/viewthread.php?tid=47663
http://www.cn-dos.net/forum/viewthread.php?tid=48747
2008-8-22 02:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Johnham
初级用户




积分 24
发帖 11
注册 2008-8-21
状态 离线
『第 3 楼』:  

提的问题的意思是,比如一个1.2GB的单一的EXE,在DOS下,COMMAND是如何加载它的?假定程序自己没有设计模块化加载。

EMM和XMS假定是先决条件,EXE去使用EMM/XMS管理的高端内存来放置大数据是完全可行的,问题是EXE自身。

难道也被放进了1M以上,或被COMMAND分段加载了?但测试发现EXE启动后,即使移除源盘(拔除U盘),整个程序仍可完整运行到底,于是分段加载的可能行被排除。

可能行大致在于放到了1M以上,如何排放的,实在不得其解

2008-8-22 21:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 4 楼』:  

纯DOS下执行大于常规内存的EXE文件应该会出现内存不足的提示,请不要把DOS和WINDOWS的命令行模式混为一谈。

2008-8-25 00:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
DOSforever
金牌会员





积分 4633
发帖 2236
注册 2005-1-30
状态 离线
『第 5 楼』:  

我倒不认为他把 DOS 和 Windows 的命令行混为一谈了,什么 EMM/XMS、高端内存、1M以上,这些他都知道。不过用词和概念还是有那么些不准确。

一般而言 .exe 结构的文件分为三个段:代码段、数据段、堆栈段,堆栈段可以没有,数据段可以放在常规内存也可以放到 XMS/EMS 中去,但代码段只能在常规内存中,正因为如此所以后来才出现了像 DOS4GW 这样的 DOS Extender 。



DOS倒下了,但永远不死
DOS NEVER DIES !

投票调查:
http://www.cn-dos.net/forum/viewthread.php?tid=46187

本人尚未解决的疑难问题:
http://www.cn-dos.net/forum/viewthread.php?tid=15135
http://www.cn-dos.net/forum/viewthread.php?tid=47663
http://www.cn-dos.net/forum/viewthread.php?tid=48747
2008-8-25 02:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Johnham
初级用户




积分 24
发帖 11
注册 2008-8-21
状态 离线
『第 6 楼』:  

COMMAND加载EXE的时候,调用INT 21的EXEC功能把各段作重定位,假定运用了DOS EXTENDER的EXE的重定位表具有比不运用DOS EXTENDER的重定位表有更多的内容,是可以理解的,但未见文章介绍这种重定位表的内容与常规的有什么本质不同,也未见文章说从哪个DOS版本开始,COMMAND开始可以“感知”EMM/XMS的存在,高手请解惑。

不只哪位还保留有《COMMAND分析教程》,可惜当年我只买了《BIO分析教程》,愿交换共享。希望《COMMAND分析教程》里讲到了COMMAND与EMM/XMS共同作用来运行大程序,如果没有,似乎只能在DOS EXTENDER里求解了。

2008-8-26 00:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Johnham
初级用户




积分 24
发帖 11
注册 2008-8-21
状态 离线
『第 7 楼』:  

还是想请高手进来提示一下

猜测,COMMAND装载WATCOM或DJGPP产生的使用DOS扩展器的程序时(可以大到GB),或许从重定位表里看到的是只有几个段的小EXE,比如仅几十K,控制转移到EXE后,进入保护模式,加载自己的剩余部分,跳到真正开始处,在平坦内存下运行。

这种标准头的功能,编译器可以实现,类似C0.ASM,如果是这样,则COMMAND就并不需关心这个程序真的是多大,或者说,COMMAND被欺骗了一下,并且,并不为DOS保护模式下的大程序专门做什么,一切都是EXE自己去完成的

以上仅是猜测,有分析过INT21 EXEC的请介绍下EXEC的具体作为?不知道EXEC会不会去核对EXE文件目录表的文件大小字段,如果核对,会出错

2008-9-3 22:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 8 楼』:  

纯DOS下面,系统只管理常规内存那一块(大于1M以上的,虽然我们可以通过一些接口来访问,但DOS本身不会去管这块--DOS内存链仅包含1M以下的内存<以节为单位>),所以DOS程序大于常规内存的话就会出现内存不足的提示。通常的解决办法是——数据独立成文件,通过程序加载到扩展内存;代码段,通过OVL方式动态加载、卸载到常规内存。

2009-4-21 21:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
johnsonlam
银牌会员

阿林


积分 1410
发帖 497
注册 2004-6-28
来自 九龍,香港
状态 离线
『第 9 楼』:  


1) 舊 方 法 : Overlay - 先 載 入 一 部 份 , 需 要 時 再 載 入 其 他 , 覆 蓋 原 來 的 部 份

2) DOS Extender: 要 求 Memory Manager 取 得 XMS , 再 將 程 序 載 入 XMS 內

3) Swap: 把 一 部 份 程 序 轉 移 到 硬 盤 , EMS 或 XMS , 再 載 入 其 他, 覆 蓋 原 來 的 部 份


[ Last edited by johnsonlam on 2009-4-22 at 00:41 ]



我 的 網 站 - http://optimizr.dyndns.org
2009-4-22 00:39
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
Johnham
初级用户




积分 24
发帖 11
注册 2008-8-21
状态 离线
『第 10 楼』:  

Overlay的方式好理解,EXE的特征就是一个(通常)小于640KB的EXE,是主程序,后面跟了几个巨大的OVL文件,当年的PCTOOLS就那模样,相当羡慕。
比较关注的还是DOS EXTENDER方式,试着DEBUG进一种我用的DOS32A,28K完成了实模式到平坦模式的转换然后加载用户应用,把大EXE放进了整个可用的物理内存中。
反汇编工具老了,有些32bit代码反汇编不好读起来感觉不对劲,只好作罢。90年代没有学习DOSEXTENDER,WINDOWS时代,再也没机会了。

2009-4-29 13:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 11 楼』:  

首先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 ]

2009-5-2 01:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: