DPMI在C语言中的实现方法浅析

来源:互联网 发布:linux reboot无法重启 编辑:程序博客网 时间:2024/05/18 01:46
        本文使用通俗易懂的表述,深入浅出地介绍DPMI和DOS Extender(以DOS/4GW为例)的理论和基本使用技术,旨在让对DPMI不太了解的程序员能了解DPMI在C语言中的实现方法。限于本人水平及资料匮乏,文中难免存在不当之处,望各位读者不吝赐教。

DPMI和DOS Extender

        DPMI是DOS保护模式接口(DOS Protected Mode Interface)的英文缩写,是在DOS平台下实现大内存编程的重要手段。众所周知,DOS默认支持管理的最大内存空间为640KB。随着硬件科技的发展,在80年代末期、90年代初期,拥有超过640KB的内存的系统诞生了。这就要求DOS能够使用和管理高于640KB部分的内存空间。
        DPMI就是在这种背景下诞生的技术,它提出了Real Mode(实模式)和Protected Mode(保护模式)的概念。所谓Real Mode,就是DOS默认的工作模式,在这种模式下DOS最多只能管理640KB内存。而Protected Mode是由DPMI平台提供的一种新模式,在这种模式下DOS可以管理16MB甚至更多的内存空间,这对于当时的计算机应用已经绰绰有余(事实上,超过16MB内存的计算机系统一直到1997年才得以普及)。
        下面详细解释Protected Mode的实现方法。首先需要指出,Protected Mode只是一个抽象概念,其具体实现依赖于DOS Extender(关于DOS Extender,还没有统一的中文翻译)。DOS Extender是DPMI的具体应用,可以将它理解为一个程序。和Real Mode下的其它应用程序一样,它占用640KB中的一部分。但是它可以让经过特殊设计的应用程序以它为平台运行。这样,这些应用程序就可以通过DOS Extender访问高于640KB的内存空间。
        常见的DOS Extender包括DOS/16M、DOS/4G、DOS/4GW、DOS32A、Causeway等,它们都通过DPMI实现对大内存的管理。

认识Watcom C/C++和DOS/4GW

        Watcom C/C++是80386时代风靡全球的C语言开发工具。它并没有强大的Integrated Development Environment(IDE,集成开发环境),但编译的目标程序的执行效率却比当时Borland和Microsoft的编译器编译的快很多。因此,Watcom C/C++得到了许多程序员,尤其是游戏开发者的青睐。
        在众多DOS Extender中,最出名的是由Rational Systems Inc.(现在更名为Tenberry Software)开发的DOS/16M、DOS/4G和DOS/4GW。在许多老游戏的执行之初,我们都可以看到DOS/4GW的字样,这就说明这些游戏是通过DOS/4GW访问大内存的。
        刚刚提到的三个DOS Extender虽然都是Rational Systems Inc.的产品,但还是有差别的。DOS/16M是16位的Extender,它兼容许多16位编译器(比如Borland C 2.0);DOS/4G和DOS/4GW都是32位的Extender,它只兼容32位的编译器。其中,DOS/4GW是DOS/4G为当时如日中天的Watcom C/C++制作的特别版,售价比较低,代价是最多只能管理16MB内存(不过在当时已经足够了)。

Watcom C/C++与DOS/4GW的完美搭配

        在众多实现DOS大内存程序设计的方法中,Watcom C/C++与DOS/4GW的搭配是最受欢迎的。Watcom C/C++拥有无与伦比的程序执行效率;而DOS/4GW不仅稳定,功能也十分强大(由于运行在保护模式下的程序往往在访问硬件时遇到困难,DOS/4GW比较好地解决了这个问题)。
        Watcom C/C++如今已经成为了一款开源的免费软件,同时更名为Open Watcom C/C++,而DOS/4GW仍然是商业软件。Open Watcom C/C++可以在其网站下载到,最新版本为1.52 RC2。这个版本中包含了DOS/4GW。
        在安装好Open Watcom C/C++后,要使用DOS/4GW编译和连接一个C/CPP文件,需要进行下面的步骤(以Open Watcom C/C++安装在D:/OWATCOMC下为例):
        在Open Watcom C/C++的安装目录下新建一个compile.bat文件,内容如下:
PATH D:/OWATCOMC/BINW
SET TEMP=D:/OWATCOMC/TEMP
SET INCLUDE=D:/OWATCOMC/H
SET WATCOM=D:/OWATCOMC/
D:/OWATCOMC/BINW/WCL386 /l=dos4g %1
DEL %1.obj

        这个compile.bat文件调用WCL386,即Open Watcom C/C++的编译和连接器,来编译和连接你的程序。
        如果要编译一个文件d:/c/hello.c,则在DOS提示符下输入:
D:/OWATCOMC/COMPILE d:/c/hello.c
        这样就可以在D:/OWATCOMC下生成hello.exe。
        程序并不要做额外的更改,但你可以定义更多的大数组(但不是更大的数组),申请更大的内存空间(总和不超过16MB,如果使用DOS/4G就可以申请到总和多达64MB的内存空间)。

总结

        笔者也刚刚接触DPMI不久,资料匮乏是在研究这种技术时遇到的最大障碍。如果你对Protected Mode编程有兴趣,或有所指教,欢迎你和我联系。我的网站为http://wecan.name/。
        要想真正用好DPMI技术是十分困难的,必须对汇编语言有所了解才行。不过,如今的Windows已经是一个在Protected Mode下运行的超级程序,现在的程序员在编程时完全不必受到DPMI使用中琐碎的束缚。然而,学习在DOS下使用Protected Mode,对深入了解80x86计算机系统的工作原理是很有裨益的。

http://www.openwatcom.org/
原创粉丝点击