📄 dos
字号:
C:\MAIL\dpmi\Pdpmi-1.doc
DOS 保护模式接口规范
---DPMI 0.9规范 中文版 1.0
*************************************** 编译 BY YaoQingYu SICHUAN
UNIVERSITY *
***************************************
说明:
因小弟水平有限,难免有语法及文法错误,还望各位看官提出批评
指导。希望有朋友能把好的有关计算机技术文档的英文原稿喂给我,现在我已经蛋尽粮绝了!!^_^
******************************
* EMAIL: *
* comsci@mail.sc.cninfo.net*
* comsci@263.net *
******************************
********** 目 录 ***********
1 简介
***********************************
2 关于保护模式程序的一般性提示
2-1 虚拟DOS环境
2-1-1 非虚拟方式
2-1-2 半虚拟方式
2-1-3 全虚拟方式
2-2 描述符管理
2-3 中断标志管理
2-4 中断
2-4-1 硬件中断
2-4-2 软件中断
2-5 虚拟内存与页锁定
**********************************
3 模式和堆栈交换
3-1 堆栈与堆栈交换
3-1-1 保护模式堆栈
3-1-2 已锁定的保护模式堆栈
3-1-3 实模式堆栈
3-1-4 DPMI主机0环堆栈
3-2 预定义中断映射
3-3 模式交换
3-4 状态保存
**********************************
4 错误处理
********************************
5 装载DPMI客户和扩展应用程序
5-1 获得实模式到保护模式的交换入口指针
5-2 调用实模式到保护模式的交换入口指针
*******************************
6 中止保护模式程序的运行
*******************************
7 模式检测
*****************************
8 局部描述表描述符管理服务(LDT)
8-1 分配一个LDT描述符
8-2 释放一个LDT描述符
8-3 描述符分段
8-4 获得下一个选择符的增量
8-5 保留子函数
8-6 获得段基地址
8-7 设置段基地址
8-8 设置段位限制
8-9 设置描述符存取权限
8-10 创建代码段别名描述符
8-11 获得描述符
8-12 设置描述符
8-13 分配特殊LDT描述符
*************************
9 DOS内存管理
9-1 分配DOS内存块
9-2 释放DOS内存块
9-3 重设DOS内存块
*************************
10 中断服务
10-1 获得实模式中断向量
10-2 设置实模式中断向量
10-3 获得处理器异常处理向量
10-4 设置处理器异常处理向量
10-5 获得保护模式中断向量
10-6 设置保护模式中断向量
*************************
11 传输服务
11-1 模拟实模式中断
11-2 用远程返回结构调用实模式过程
11-3 用内部返回结构调用实模式过程
11-4 分配实模式回调地址
11-5 释放实模式回调地址
11-6 获得状态保存/存储地址
11-7 获得实模式交换地址
*************************
12 获得版本号
*************************
13 内存管理服务
13-1 获得空闲内存信息
13-2 分配内存块
13-3 释放内存块
13-4 重设内存块
*************************
14 页锁定服务
14-1 锁定线行区域
14-2 解开线行区域
14-3 将实模式区标注为可页化
14-4 重新锁定实模式区
14-5 获得页大小
*************************
15 按需求处理换页调整服务
15-1 保留子函数
15-2 将页面标注为需求页化替换页
*************************
16 物理地址映射
*************************
17 虚拟中断状态函数
17-1 获得或禁用虚拟中断状态
17-2 获得或激活虚拟中断状态
17-3 获得虚拟中断状态
**************************
18 获得向量指定的API入口指针
**************************
19 调试寄存器支持
19-1 设置调试监视定
19-2 清除调试监视点
19-3 获得调试监视定的状态
19-4 重置调试监视点
**************************
20 其他APIS
**************************
21 对DOS扩展程序的提示
21-1 初始化扩展应用程序
21-2 安装API的扩展
21-3 装载应用程序
21-4 提供API扩展
**************************************
1 简介
DOS保护模式接口的定义使DOS程序使用扩展内存成为可能,当然这必须在有PC体系结构的计算机(使用
INTELX86系列芯片),且要在维持系统保护模式下才可行。DPMI定义了一组DOS和BIOS的可调用子功能。它们可以由保护模式的DOS程序组成。DPMI也定义了一组新的软件中断,功能号:INT-31H。保护模式下的DOS程序可以调用它们,这些中断主要的功能是帮助保护模式程序分配内存,修改描述符,调用实模式程序等等。能够支持虚拟DOS模式的操作系统,在不影响其系统安全的情况下,也应该有支持DPMI的能力。
在这篇文章中,实模式软件被定义为-在1M内存地址空间中运行,且使用段:偏移量寻址方式的那些代码。
在很多DPMI的实例中,也可以让实模式软件运行在虚拟8086模式下。因为虚拟8086模式和实模式非常的接近,
所以我们也将它考虑成实模式。
DPMI的服务仅对保护模式的程序可用。在实模式中运行的程序不能使用这些服务功能。保护模式程序在进
入保护模式调用INT31之前必须使用在20页中描述的服务功能,所有的INT31H功能都会修改标志位和AX寄存器
所有的其它寄存器在其不要返回数值的条件下都将被保留,未被支持的调用会在设置进位标志位后返回,如果
INT31H设置了一个陷门,则中断B标志位就不能被任何INT 31H调用所改变,除非当内存管理与中断标志位管
理调用发生时,所有的内存管理调用都能使用中断,中断标志位管理调用在被特别指定的情况下也能修改中断
标志位,所有的INT31H的服务都是可重入的。
某些DPMI的实例能够运行80386的32位程序,当程序运行在32位模式下时,DMPI函数能将16位的寄存器用32
位的扩展寄存器来代替。
在运行16位保护模式程序时32位寄存器的高段位会被忽略,DPMI服务是由被称为DPMI主机程序所提供的,使用这些服务的程序被称作DPMI客户,一般情况下DPMI客户有两种类型:
1:扩展应用程序
2:直接使用DPMI的应用程序
绝大多数的DPMI应用程序都是扩展应用。扩展应用程序
由一个扩展器来分界,DPMI客户和应用程序调用扩展器服务后即被客户程序编译成真正的DPMI调用。使用一个扩展应用程序的好处是很明显的,它可以让客户程序使用不只一个的DPMI主机服务,事实上我们建议扩展器用下列命令来搜寻扩展服务
。DPMI
。VCPI/EMS
。XMS
。TOP-DOWN(INT 15H)
一个扩展器能够提供一组API给应用程序,然后将其编译为真正的可以提供的服务,当主机扩展服务不足时
在扩展器中的一个特殊的功能就必须为应用程序提供上述服务。
*****************************************
图一
Figure 1. 图一 应用程序/扩展器/客户/主机/操作系统结构
+----------------------------------------------------------+
| |
| +----------------------------------------------------+ |
| | | |
| | 应用程序代码 | |
| | | |
| +----------------------------------------------------+ |
| |
| +----------------------------------------------------+ |
| | 扩展器基地址 (包括 APIs) | |
| | -------------------------------------------------- | |
| | DPMI | |
| | 客 户 | |
| +------------+ | |
| | VCPI | |
| | 客 户 | |
| +------------+ | |
| | XMS | |
| | 客 户 | |
| +------------+ | |
| | Top-down | |
| | client | |
| +-------------+ |
| |
+----------------------------------------------------------+
+------------+
| |
| |
| |------------+
| | |
| DPMI | |
| 主机 | VCPI |------------+
| | | |
| | | |
| |------------| XMS |-------------+
| | EMS | | Top-down |
| | | | (Int 15h) |
+----------------------------------------------------+
+----------------------------------------------------+
| |
| 操 作 系 统 (e.g. DOS) |
| |
+----------------------------------------------------+
**************************************************************
2 虚拟DOS环境
很多DPMI可以模拟‘虚拟DOS’段。换句话说就是DOS接口环境提供给程序的接口并不是真实的操作系统接口。硬件中断,I/O与处理器异常都能被操作系统虚拟化。这就表示一个DPMI程序能够接收一个虚拟的键盘中断并且能从键盘控制端口处读虚拟的输入输出。
在这种环境下,真正的硬件中断都是被操作系统所管理的。对DPMI程序来讲,物理上的中断是不可见的。如果操作系统有这个功能,则它会映射一个虚拟的中断给DPMI程序,而DPMI并不知道这个中断是否是真实的,它也没有必要关心,从程序员的角度来看这个虚拟的中断就如同真实的中断一样。
操作系统同样会将输入输出中断控制器和其它设备虚拟化。DPMI的虚拟化功能提供了3种类型;
2-1-1 非虚拟化
一般情况下,标准的单任务DPMI实例并不会虚拟化任何硬件设备,这些程序就好比在标准DOS的实模式下工作一样,在这种情况下,使用DPMI主机设备的扩展器服务功能会将保护模式的DOS调用转换成标准的DOS实模式调用,就是将处理器设置成实模式工作方式。
2-1-2 半虚拟化
某些DOS环境会虚拟化硬件设备,提供程序虚拟内存或者其它需要某些硬件虚拟化的服务。在这些环境下,DPMI应用程序就只能运行在非特权级别上,就是通常所称的第4级别环。部分或全部硬件中断和I/O都会被虚拟化,虚拟内存将被支持,在这种情况下的实例中,页锁定服务通常被用来锁定中断和异常处理代码段。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -