Board logo

标题: 为何内存加大后 DPMI 不可用? [打印本页]

作者: DOSforever     时间: 2008-9-21 23:17    标题: 为何内存加大后 DPMI 不可用?

MS-DOS 6.22 ,原内存为256M,加大到384M后发觉原来所有可使用 DPMI 的程序都出错。使用的 DPMI host 程序为 QEMM 9.0 中的 QDPMI 。

QEMM 版本:

  Quote:
Quarterdeck Expanded Memory Manager 386 V9.00.ƒ003ß
Copyright (c) 1986-1997 by Quarterdeck Corporation

QDPMI 和所提供的 DPMI 版本,以及其设置:

  Quote:
QDPMI: Quarterdeck DPMI Host V1.10

DPMI 0.9 Services are.......ON   MaxMem=<MAX>, MinMem=<MIN>, MaxLow=<NONE>
DPMI Virtual Memory is......OFF
Extender Checking is........ON   Overlay=C:\QEMM\QDPMIVM.OVL
Real Mode Int Handling fix..OFF  Client Start Address=40000000H

比如原本 PKZIP / PKUNZIP 是可以通过调用 DPMI 来提高效能的,但现在运行时却无法使用 DPMI ,一旦调用就出错:

  Quote:
PKZIP (R)   FAST!   Create/Update Utility   Version 2.50   03-01-1999
Copr. 1989-1999 PKWARE Inc.  All Rights Reserved.   Shareware Version
PKZIP Reg. U.S. Pat. and Tm. Off.  Patent No. 5,051,745
QDPMI: Nested Page Fault in QDPMI Kernel [PTE=0000-0000h]
       [CR2=0080-0003h at 0020h:0000-5478h]

QDPMI: Unrecoverable Exception: 000Eh at 0020h:0000-5478h.  Error Code = 0002h

还有一些出错时的内存地址和寄存器值如下:

  Quote:
QDPMI: Nested Page Fault in QDPMI Kernel [PTE=02D5-4007h]
       [CR2=0080-0003h at 0020h:0000-23B9h]                                                                              
QDPMI: Unrecoverable Exception: 000Eh at 0020h:0000-23B9h.  Error Code = 0002h


作者: DOSforever     时间: 2009-4-13 09:56
等待高手回答
作者: stockghost     时间: 2009-5-16 23:18
DOSforever,你说的问题,DPMI我有过了解,但对具体的东西不太清楚。
估计是内存过大,DOS6.2x下DPMI好像不能超过256M。

下面是我的一点经验,供参考。
曾经用Djgpp为256M的联想无盘站M270S(环境纯DOS6.21)写过程序,原DOS6.21系统别人事先配置好。
CWSDPMI进去后找C:\cwsdpmi.swp,用-s-取消后,分配不了多少内存就出错,无法使用。
用内存盘虚拟c:\,程序大部分正常,但运行时常碰到分配内存的错误,使得程序异常终止退出或死机。
估计是程序要不断地分配释放内存造成内存碎片太多以至于无法再分配内存或者扩展内存管理程序太旧造成的。
后来还是取消内存盘,将cwsdpmi -s,把DOS6.21的himem.sys、emm386.exe换成MSDOS 7.1的,将config.sys中
device=emm386.exe noems xxxx改为device=emm386.exe noems novcpi后,程序运行正常。
该程序在msdos7.1下,256、384内存运行正常。