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

DPMI16BI.OVL 精简版 BC3.1,运行缺少文件, 出现错误信息:failed to locate DPMI server(DPMI16BI.OVL) 立即下载
        本文使用通俗易懂的表述,深入浅出地介绍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/
ANSYS Fluent热边界条件避坑指南:为什么你的自然对流计算结果总出错? 本文深入剖析了在ANSYS Fluent中进行自然对流仿真时,导致计算结果出错或发散的核心原因与解决方案。重点解析了重力项与操作密度设置、Boussinesq与不可压缩理想气体模型的抉择、以及压力离散格式(推荐Body Force Weighted)这三大关键雷区,并结合电子机箱散热等实战案例,提供了一套稳定可靠的仿真设置流程与调试技巧。 阅读详情

相关推荐

STM32驱动四位共阳极数码管实现高精度秒表计时器

本文详细介绍了如何使用STM32驱动四位共阳极数码管实现高精度秒表计时器。项目基于STM32F103C8T6最小系统板,通过定时器中断和GPIO控制,实现0.1秒精度的计时功能,并解析了共阳极数码管的动态扫描原理及按键消抖等关键技术。

n8m7b6v5c4的博客 951

实模式和保护模式

80386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode。实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存。在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅

laviolette的专栏 1万+

如何构建高质量的 QA 问答知识库

NLP 技术落地最普遍的场景就是智能客服,如阿里的”小蜜“,京东的“JIMI”等等。NLP 技术也广泛应用于搜索系统。无论是“智能客服”,还是“搜索系统”,构建的前提是拥有“高质量的QA知识库”。今天聊聊“如何构建高质量QA知识库。”。 历史对话数据分布分析 基于公司现有系统积累的大规模对话文本数据,需要对文本数据进行归类处理,分析每个部分数据的占比,挖掘出有价值的文本通过 NLP 相关技术进行商业价值转化。下文以医疗领域来举例说明,通过输入对象,可以将文本分为客服输入和用户输入两部分。挖掘相关问题,主要从

Jiassheng的博客 2151

Watcom C/C++的发展史

非常有趣的是,Watcom C/C++走的路子和Symantec C/C++几乎是完全相反的。当时出品Watcom C/C++编译器的是一家加拿大的小公司,不过这家公司却对最佳化编译器有深入的研究。当时,Watcom C/C++是以在DOS下能够产生最佳化程序代码闻名于世的,许多写游戏和DOS Extender的厂商都指名要使用Watcom C/C++,因为不论是Borland C/C++还是Vi

snail8384的专栏 4102

光电转换器件PMT,APD总结

PMT和APD都属于单点探测器,只能探测光子信息,可以通过扫描方式测光谱。 1. PMT PMT:光电倍增管,是光子技术器件中的一个重要产品,它是一种具有极高灵敏度和超快时间响应的光探测器件。 原理:光电倍增管是一种真空器件。它由光电发射阴极(光阴极)和聚焦电极、电子倍增极及电子收集极(阳极)等组成。当光照射到光阴极时,光阴极向真空中激发出光电子。这些光电子按聚焦极电场进入倍增系统,并通过进一步的二次发射得到的倍增放大。然后把放大后的电子用阳极收集作为信号输出。 优点:因为采用了二次发射倍增系统,.

Ammon_Zhang的博客 1万+

flowable工作流源码解析-DB访问

Flowable用了mybatis组件,又实现了自己的command和interceptor机制。具体是怎么实现的呢? 我们以Deployment操作为例,来看看它的调用链 调用端是Service接口, 它委托自己的commandExecutor去执行具体的Command. Command最终会调用到EntityManager,然后委托给ibatis的sqlsession来完成操作。 其中CommandExcutor调用command的地方有些复杂,我们展开看: CommandExecutor会维护一系

coobee的博客 2484

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

zhuanzaihttp://tanshank15408.blog.sohu.com/157003732.html 本文使用通俗易懂的表述,深入浅出地介绍DPMI和DOS Extender(以DOS/4GW为例)的理论和基本使用技术,旨在让对DPMI不太了解的程序员能了解DPMI在C语言中的实现方法。限于本人水平及资料匮乏,文中难免存在不当之处,望各位读者不吝赐教。DPMI和DOS Exte

gx19862005的专栏 3846

NCCL 核心集体通信操作深度解析:从原理到优化实践

操作逻辑:若 N 个 GPU 各持有一段数据(大小为 S),通信后每个 GPU 会持有所有 N 段数据(总大小为 N×S)。典型场景:多卡推理结果聚合、模型并行中间结果同步。操作逻辑:N 个 GPU 各持有数据,通过归约(求和、取平均等)运算后,所有 GPU 获得相同结果。典型场景:数据并行训练的梯度聚合(如 SGD 优化器)。操作逻辑:N 个 GPU 各持有 N 份数据分片,通信后每个 GPU 获得所有 GPU 的对应分片。典型场景。

jundao1997的专栏 679

浅谈DOS扩展器和DPMI

浅谈DOS扩展器和DPMI  作者:TBsoft Software Studio(2005)  MS-DOS已经成为历史,但是DOS并没有消失。  没有MS-DOS,还可以使用FreeDOS等GNU DOS系统,现在许多计算机厂商在低档计算机中不预装昂贵的Windows,而预装FreeDOS,FreeDOS的网站是http:/

Changjiang的专栏(TBsoft工作室BLOG) 8356

揭秘AI人工智能中Stable Diffusion的模型微调技巧

Stable Diffusion作为一种强大的文本到图像生成模型,在艺术创作、设计、娱乐等多个领域展现出了巨大的应用潜力。然而,其默认的模型输出可能无法满足特定用户或特定场景的个性化需求。本文章的目的在于深入揭秘Stable Diffusion的模型微调技巧,让读者能够根据自己的需求对模型进行定制化调整,生成符合特定风格、主题或要求的图像。范围涵盖了从基础概念到实际操作,从理论原理到项目实战的全方位内容,旨在为读者提供一个系统且深入的学习指南。

大模型应用工坊 948

虚幻商城 Fab 免费资产自动化入库

Fab 商城的所有的免费资产自动化入库

一碗清深的博客 3636

如何下载和安装Open Watcom C / C ++编译器

下载Watcom C / C ++编译器 ( Download the Watcom C/C++ Compiler ) Watcom has been around a long time. I wrote applications with it in 1995, so the hardware/software requirements (listed below) to use ...

cumao2792的博客 2727

python-pandapower电力系统潮流计算(算例8:ieee33节点潮流计算))

python-pandapower电力系统潮流计算(算例8:ieee33节点潮流计算))

总裁余(余登武)博客 5032

关于OpenWatcom

<br />前几天突然想到要用C程序访问32位指令,比如本来用汇编可以很方便实现的访问eax,esi等等,简单的用TC、BC写了一个小程式,一试,居然无法识别EAX,ESI!这下头大了,要访问PCI配置空间,不用EAX怎么行呢?在网上搜了一下,再经高手指点,用如下文章做个小小总结,呵呵,提醒一下自己(如下一段是在其它网站上找到的,借用一下):<br /><br />写flash tool访问BIOS ROM的时候一定要把A20#打开~进入的big real mode。<br />不过有一个软件工具可以帮你实

想变肥肥826的专栏 1952

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

编译器介绍——OpenWatCOM

编译器介绍--OpenWatCOM前言    对于16位程序的开发或许各位并不陌生。但是,随着Win32,Linux,BSD等32位操作系统的广泛应用,我想各位一定觉得:现在还有谁会用16位的开发呢?不过,你要知道,其实现在很多地方都可以有16位的开发。不但如此,因为16位的指令简洁,并没有32位的那么复杂。所以,对16位的研究就是为32位打基础。所以,即使现在32位的程序,系统广泛的应用,即使6

北斗星君的专栏 5800

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

内存(肖舸的笔记)

内存可以说是C和C++语言学习的关键点。这里说一点我的理解,一家之言,欢迎拍砖哈。内存要想理解透彻,首先要理解内存编址。即不同的内存条,内存模块,插到机器上,具体对应的内存地址是多少。最开始的PC机,IBM PC XT,只有640k内存。IBM是这么规划的,最低的128k,是BIOS的地址,毕竟BIOS也是汇编语言,它也需要合法地址,才能被CPU正确运行。5

缘起宇轩阁 1205

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

dos4gw.exe

  进程知识库 dos4gw - dos4gw.exe - 进程信息进程文件: dos4gw 或者 dos4gw.exe进程名称: Microsoft DOS 32 bit extension   描述:dos4gw.exe是微软DOS操作系统在32位操作系统上的扩展壳。这不是纯粹的系统程序,但是如果终止它,可能会导致不可知的问题。

ProcessInfo的专栏 1711

【RMQ】poj 3264 Balanced Lineup

RMQ 查询区间最值。 自然可以用线段树来做。 但对于序列值不改变的问题,查询可以用dp+位运算 其算法可以看作由区间dp演化而来,一般的数位dp需要用O(n^2)的时间复杂度来处理,预处理得到区间可以是任意的。 此时用功能的弱化来换时间。我们预处理只处理出区间 i->i+(2^j)-1 最值, 我们想得到 i->j 的最值可以由两个交叉的区间取最值来求(正因为求的是最值,所以区间

学无纸巾 2033

【亲测免费】 探索 Open Watcom: 开源的 Watcom C/C++ 编译器

探索 Open Watcom: 开源的 Watcom C/C++ 编译器 Open Watcom 是一个开源的编译器套件,用于开发 C 和 C++ 应用程序。它支持多种操作系统,并具有许多独特的特性和功能,使其成为软件开发者的一个强大工具。 什么是 Open Watcom? Open Watcom 是一种 C/C++ 编译器套件,由原 Watcom 公司开发并后来开源。这款编译器最初被设计为在 D...

gitblog_00047的博客 1387

惊艳的Open WATCOM C/C++

为什么80%的码农都做不了架构师?>>> ...

weixin_33762130的博客 1235

浅谈C语言中断处理机制

一、中断机制      1、实现中断响应和中断返回   当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急、更重要的工作,则在执行完当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由用户自己

Auspicious Cloud's View 3万+

三级分类数据的排序

--示例数据:CREATE TABLE tb(ProdCateID int,ProdCateName nvarchar(10),ParentCateID int)INSERT tb SELECT 1, N服装           ,0UNION ALL SELECT 2, N箱包         ,0UNION ALL SELECT 3, N内衣         ,1UNION ALL

emailqjc的专栏 3082

C++LONG_MAX和LLONG_MAX的使用

代码】C++LONG_MAX和LLONG_MAX的使用。

大模型天花板 3821
上一篇: 浅谈DOS扩展器和DPMI
下一篇: 屏幕录象与视频录象的开发
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值