DOS保护模式接口全.docx
- 文档编号:6531361
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:63
- 大小:41.69KB
DOS保护模式接口全.docx
《DOS保护模式接口全.docx》由会员分享,可在线阅读,更多相关《DOS保护模式接口全.docx(63页珍藏版)》请在冰豆网上搜索。
DOS保护模式接口全
DOS保护模式接口
---DPMI0.9规范中文版1.0
**********目录***********
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-4DPMI主机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描述符
*************************
9DOS内存管理
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标志位就不能被任何INT31H调用所改变,除非当内存管理与中断标志位管
理调用发生时,所有的内存管理调用都能使用中断,中断标志位管理调用在被特别指定的情况下也能修改中断
标志位,所有的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(INT15H)
一个扩展器能够提供一组API给应用程序,然后将其编译为真正的可以提供的服务,当主机扩展服务不足时
在扩展器中的一个特殊的功能就必须为应用程序提供上述服务。
*****************************************
图一
Figure1.图一应用程序/扩展器/客户/主机/操作系统结构
+----------------------------------------------------------+
||
|+----------------------------------------------------+|
||||
||应用程序代码||
||||
|+----------------------------------------------------+|
||
|+----------------------------------------------------+|
||扩展器基地址(包括APIs)||
||--------------------------------------------------||
||DPMI||
||客户||
|+------------+||
||VCPI||
||客户||
|+------------+||
||XMS||
||客户||
|+------------+||
||Top-down||
||client||
|+-------------+|
||
+----------------------------------------------------------+
+------------+
||
||
||------------+
|||
|DPMI||
|主机|VCPI|------------+
||||
||||
||------------|XMS|-------------+
||EMS||Top-down|
||||(Int15h)|
+----------------------------------------------------+
+----------------------------------------------------+
||
|操作系统(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都会被虚拟化,虚拟内存将被支持,在这种情况下的实例中,页锁定服务通常被用来锁定中断和异常处理代码段。
?
2-1-3完全虚拟化
这个环境将提供一个完全的模拟的DOS环境。
而原始的操作系统的某些部分会与MS-DOS有些不同。
在DPMI的这个实例下,所有的设备都会被虚拟化并且有某些扩展。
一般情况下,页锁定服务会被这些实例所忽略因为所有的物理中断和I/O处理都会由操作系统来管理,程序即一直运行于一个非特权级的环上。
2-2描述符管理
因为保护模式的代码段不能被修改,所以这就需要程序在它想在代码段存储数据时分配一个特殊的数据描述符,在实模式下工作的段运算不能在保护模式下运行。
某些调用返回描述符的有效范围。
例如如果一个16位模式的程序分配了一个大于64K的内存块,则调用会分配连续的一系列描述符,每一个描述符都会有一个段限制,其中包含有这些块的剩余量。
并且调用会返回在这些描述符序列的第一个描述符。
要得到下一个选择符,则必须在程序中加上INT31H调用0003H的返回值。
为了与其他的老式系统兼容,有两个中断控制器的计算机就会将其中一个副控制器用BIOS重定向的办法映射到主控制器的范围内。
例如在IBMAT兼容计算机上的IRQ2就会映射为IRQ9(中断71H)。
在实模式下,这些系统的BIOS会将中断71H转换为INT-0AH和在副中断控制器上的EOI。
需要在使用由BIOS重定向中断的包含模式程序会使用如下这些技术:
2-3中断标志位管理
POPF和IRET这两个指令并不能修改中断标志位,因为很多DPMI的实例都在IOPL《DPL的模式下运行,只有执行CLI或者STI指令才能修改中断标志位。
如下的代码会让中断失效:
XXX;
XXX;(在这之前中断都是有效的);
PUSHF
CLI
XXX
XXX
POPF(中断失效了);
应当注意到有些DPMI的实例会为保护模式的DOS程序维持一个虚拟的中断状态,但当前中断标志位的值并不能反映虚拟中断的状态,既然如此保护模式的程序就应该使用虚拟中断状态服务来决定当前的中断标志位状态。
既然CLI和STI是特权级的指令,如果使用不当则他们可能会引起一个保护性的错误。
DPMI的提供者也会模拟这些指令。
由于在异常处理时会引起程序首部的混乱,所以SLI和CLI应当尽可能的少用,一般情况下,至少让他们应该在300个时钟周期之后才使用一次。
2-4中断
保护模式程序能够对软件和硬件两种中断通过使用DPMI的获取和设置保护模式中断向量功能来设置陷井。
从硬件设备发出的中断例如从时钟和键盘控制器中发出的中断总是首先能被映射,并且被保护模式的中断处理。
如果保护模式没有处理到或是调用了前一个中断,那么这个中断会被映射到实模式。
当一个中断被映射到了实模式,EAX,EBX,ECX,EDX,ESI,EDI,EBP等寄存器和标志位都会从保护模式变到实模式,并且不能被选择。
而段寄存器则留下没有定义的值,除非有API的翻译器将它重新定义为明确的实模式段地址。
DPMI也会自动的为映射成实模式的中断设置堆栈。
2-4-1硬件中断
中断控制器被映射到系统的预定义中断中。
例如在一台IBM-AT兼容系统中,主中断控制就基于8号中断编程,而副中断控制则基于70中断编程。
被虚拟化后的中断控制器可以被重新编程,而在保护模式中它们的基本设置可以用INT31H的0400H功能号来检查。
硬件中断过程及其所以的数据段都必须在它所属的固定内存段中。
而能够被硬件中断陷井所涉及到的内存都必须被锁定。
处理者也总是在以一个被锁定的堆栈中被调用,请参考12页。
就像在实模式中一样,硬件中断的处理者会被以禁止中断来调用。
当IRET没有被存储在中断标志位时,硬件中断陷井必须在执行IRET前要执行一条STI指令或者中断仍然被禁止。
2-4-2软件中断
很多在实模式中执行的软件中断都不会反映出保护模式中断的陷井。
但是有如下这些在实模式中调用的软件中断和保护模式下的软件中断有所关联
它们是:
INTICHBIOS时钟中断
INT23HDOSCTRL+C中断
INT24HDOS严重错误处理中断
在实模式下,程序不应该在中断时被中止,如果程序在这点被中止的话,有可能会阻止DPMI主机的正常清除。
在所有的软件中断中,只有INT00H-07H
能够在虚拟中断禁用的情况下被调用,称作非屏蔽中断,而其他的中断不会修改中断标志位的状态。
称作可屏蔽中断。
正如前面所讲的,在实模式下调用的软件中断不能映射出保护模式下的中断陷井,所以我们的程序就需要为这些中断加载一个监视实模式中断的陷井位。
2-5虚拟内存与页锁定
在很多支持虚拟内存的DPMI实例的环境中,我们都有必要锁定那些很容易被其他程序影响到,而且是在DOS内部执行的内存块。
这样做的原因很显然,DOS是一种不可重入的操作系统,当DOS很忙时,我们不可能要求它装载页面。
如果某个DPMI实例不会调用DOS读写虚拟内存到磁盘上,那么它就会忽略页锁定服务。
一旦整个DPMI实例都被虚拟化,程序在执行当中页面错误就可以在任何一点被处理。
然而,应当注意所有DPMI
的应用程序都应该把代码段和数据段锁定,这些调用总是会在忽略它们的实例中被成功的返回。
*******************************************
3模式和堆栈交换
这一节将把DPMI主机如何在保护模式和实模式之间交换和处理堆栈交换作一个简要的介绍。
理解保护模式主机是如何维持客户原始状态,并且阻止堆栈数据被覆盖段寄存器被修改是非常重要的。
3-1堆栈与堆栈交换
每一个DPMI实任务都将有4种不同类型的堆栈:
它们是:
应用程序级别环保护模式堆栈,页锁定保护模式堆栈,实模式堆栈和DPMI主机0环堆栈。
保护模式堆栈可以被看成是一个DPMI客户在其被保护模式进入指针调用进入保护模式时运行的一部分。
页锁定保护模式堆栈则是由DPMI服务器所提供用来模拟硬件中断,处理实模式回调用的。
而DPMI主机所提供的实模式堆栈通常是为客户程序数据段内存定位的。
0环堆栈是最高特权级别堆栈,只能由DPMI主机使用,而它可能有当前正在运行的程序的状态信息。
3-1-1保护模式堆栈
这种模式的堆栈是一般情况下保护模式客户堆栈的工作方式。
DPMI客户的保护模式堆栈能在需要的时候将内存页解锁,在保护模式中被执行的软件中断能映射到这个堆栈中。
3-1-2页锁定保护模式堆栈
在硬件INT-1CH,INT-23H,INT-24H,异常中断和保护模式中的实模式回调用中,DPMI主机会自动的把它们交换到页锁定保护模式堆栈中,当中断或者调用返回时
主机会将其转换回到原来的保护模式堆栈。
注意主机只能提供给页锁定堆栈4K的空间,堆栈交换的条件可以是在首次中断或者调用被映射到保护模式时进行并且在客户程序返回时被返回原堆栈,后续的嵌套中断或调用不会引起堆栈模式交换。
软件中断不会自动的交换堆栈模式。
3-1-3实模式堆栈
DPMI主机也可以为客户程序提供至少200个字节且一直锁定的实模式堆栈,而中断则映射成实模式使用传送服务的调用也能被映射到这种堆栈下,DPMI主机不会在DOS执行这个功能之前为在实模式下处理的硬件中断自动交换堆栈模式。
3-1-4DPMI主机0环堆栈
DPMI主机会与其它DPMI任务一样使用一个堆栈,而DPMI客户程序却不能以任何方式来使用这个堆栈,这个堆栈有时可以用来在模式交换时存储状态信息。
例如在原来的保护模式程序的SS:
ESP处的数据在DPMI主机交换页面锁定保护模式时能被保存在0环堆栈中。
3-2预定义中断映象
DPMI主机为保护模式用户的所有100H号中断都提供了中断向量。
当DPMI客户初始化时,所有的中断向量都会指向自动把映射中断设置成实模式的那些代码(除了INT31H和INT21H,AH=4CH)。
当一个预定义的中断映射处理执行后,它即被交换到实模式去,并且保留EAX,EBX,ECX,EDX,ESI,EDI,EBP等寄存器和标志位,且在实模式下映射中断。
而当实模式中断返回时,预定义中断映射代码就会将其交换回保护模式并且重新设置EAX,EBX,ECX,EDX,ESI,EDI,EBP和标志位的值。
但是代码段寄存器和堆栈指针不会在两种模式之间传递。
因此,任何想在段寄存器间传递的指针和信息都需要用一个DOS扩展程序来搭载。
3-3模式交换
一个客户有三种不同的方法可以在保护模式与实模式之间交换:
1:
执行预定义的中断映射处理
2:
用传送服务来调用实模式代码
3:
使用实模式回调用从实模式交换到保护模式
4:
使用线性模式交换功能
所有的模式交换功能除了线性模式交换功能外都会在DPMI主机的0环堆栈中保留一些数据。
这就意味着不能在嵌套的模式交换中中止程序除非使用的交换功能是线性模式交换功能。
甚至也不应该试图从一组硬件中断或异常处理中断中中止那些使用线性模式交换服务的程序,因为DPMI主机会自动的执行模式和堆栈交换来提供这些服务功能。
3-4状态保留
因为DPMI主机堆栈交换会自动的越过模式交换,因此某些时候当使用线性模式交换服务时有必要使用状态保留功能来存储先前的状态。
主机系统会为其它模式的当前状态保留必要的信息,这些信息包括在CS:
IP,SS:
IP和段寄存器中的值,因为DPMI客户无法直接使用这些值,所以就需要在执行嵌套的模式交换时调用状态保留功能。
例如在有些硬件中断发生时,DPMI主机会将实模式段寄存器,CS:
EIP,SS:
ESP的值保存在0环堆栈中。
****************************************
4错误处理
并不是所有的INT31H调用都会成功,而DPMI0.9这个版本却没有为多数错误返回指定返回代码。
当一个调用失败产生后它即会将标志位置位1,并且在AX中返回未定义的值。
在将来的DPMI接口中就将把错误返回代码返回到AX寄存器中,并且把所有的错误码都会表现在AX的高位(15位)。
如果一个功能调用返回设置了的标志位并且清除的AX高位,那就意味着这个调用失败了,借助于指定的错误返回代码,将来的DPMI下运行的程序将会对所出现的错误有更恰当和及时的处理。
5装载DPMI客户与扩展应用程序
所有的DPMI应用程序开始都被在实模式中执行。
一个程序一开始必须运行与标志的实模式中但是它可以通过执行一些简单的代码段来切换到保护模式中去。
DPMI并没有定义一个可执行文件的保护模式下的格式,相反程序必须提供给DPMI它们自己为进入并固定在保护模式中运行的代码机制。
5-1获得实模式到保护模式的交换入口
在实模式中调用这个功能,就可以侦测到当前DPMI
的服务入口,并且获得能使程序在保护模式中运行的地址
调用入口
AX=1867H
执行INT-2FH
返回
如果成功则:
AX=0
BX=标志位0位=1如果支持32位程序
CL=处理器类型
02H=80286
03H=80386
04H=80486
DH=DPMI主版本号
DL=DPMI副版本号
SI=DPMI主机私有数据需要的段数(可能0)
ES:
DI=进入保护模式的调用过程的地址
如果失败则:
AX!
=0
程序员提示
使用这个功能并不是真正执行转入保护模式的操作,而
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DOS 保护 模式 接口