Windows间断编程
副标题#e#
一、前 言
Windows提供强大的成果以及友好的图形用户界面(GUI),使得它不只遍及的用作打点事务型事情的支持平台,也被家产规模的工程人员所存眷。
但Windows3.1并非基于优先级来调治任务,无法当即响应外部事件间断,也就不能满意家产应用情况中及时事件处理惩罚和及时节制应用的要求。因此,如安在Windows情况中处理惩罚外部及时事件一直是技能人员尤其是及时规模工程人员所存眷的问题。今朝已有的要领多半回收内挂及时多任务内核的方法,如windows的及时节制软件包FLX等,而iRMX及时操纵系统则把Windows3.1看成它的一个任务来运行。对付大型的工程项目,开拓人员可回收购置及时软件然后集成方法。对中小项目,从投资上思量就不很经济。如何寻找一种简明的要领来处理惩罚外部及时事件依然显得很须要。
本文首先叙述windows的动静机制及间断机制,然后团结DPMI接口,给出一种掩护模式下间断措施的设计要领,以处理惩罚外部及时事件。经实际运行功效表白,该要领具有简捷、实用、靠得住的特点,并同样可运行于Win95。
二、Windows的动静机制
Windows是一动静驱动式系统,。 Windows动静提供了应用措施与应用措施之间、应用措施与Windows系统之间举办通讯的于段。应用措施要实现的成果由动静来触发,并靠对动静的响应和处理惩罚来完成。
Windows系统中有两种动静行列,一种是系统动静行列,另一种是应用措施动静行列。计较机的所有输入设备由 Windows监控,当一个事件产生时,windows先将输入的动静放入系统动静行列中,然后再将输入的动静拷贝到相应的应用措施行列中”应用措施中的动静轮回从它的动静行列中检索每一个动静并发送给相应的窗口函数中。一个事件的产生,达随处理惩罚它的窗口函数必需经验上述进程。值得留意的是动静的非抢先性,即岂论事件的急与缓,老是按达到的先后列队(一些系统动静除外),这就使得一些外部及时事件大概得不到实时的处理惩罚。
#p#副标题#e#
三、windows的掩护模式及间断机制
1.Windows的掩护模式
掩护模式指的是线性地点由一个选择符间接生成的,该选择符指向描写表中的某一项;而实模式中则通过一个段/偏移量对来直接寻址。80386(486) CPU提仪的掩护模式本领包罗一个64K的虚拟地点空间和一个4G的段尺寸。Windows3.1实现时有所不同,它支持尺度模式和加强模式。尺度模式针对286呆板,不周本文探讨范畴。加强模式是对386以上CPU而言,windows正是利用掩护模式来冲破lM的屏障而且执行简朴的内存掩护。它利用选择器、描写器和描写器表节制会见指定内存的位置和段。描写器表包罗全局描写器表局部描写器表、间断描写器表。掩护模式与实模式有很多差异。个中显著的差别是会见内存的机制差异。
2.间断机制
(1)实模式间断
为了便于领略,我们先回首实模式间断。
在实模式下,间断向量表IVT起到相当重要的浸染。无论来自外部硬件的间断或是内部的软间断INTn,在CPU中都发生同样的响应。
①CPU将当前的指令指针寄存器(IP)、代码段寄存器(CS)、符号寄存器压入仓库。
②然后CPU利用 n值作为指向间断向量表IVT的索引,在IVT中找出处事例程的远地点。
②CPU将此远地垃装入CS:IP寄存器中,并开始执行处事例程。
④间断例程总以IRET指令竣事。此指令使存在仓库中的三个值弹出并填入CS、IP和符号寄存器,CPU继承执行本来的指令。
(2)掩护模式间断
掩护模式间断进程与实模式间断进程雷同,但它不再利用间断向量表IVT,而利用间断描写符表(IDT)。值得一提的是,Windows运行时IVT还存在,应用措施并不利用它,Windows仍然利用,但寄义已差异‘
(1)IVT布局:IVT在RAM的 0000:0000之上,占据开始的1024字节。它仍然由 BIOS启动例程配置,由DOS填充到RAM中。
②IDT间断描写符表:掩护模式下,Windows操纵系统为实现间断机制而成立的一个非凡表,即间断描写符表IDT。该表被用来生存间断处事例程的线性地点,它们是真正的24位或32位地点,没有段:偏移值布局。间断描写器表最多可含有256个例
程说明,具体说明请见[3]。
②傍边断或异常产生时,处理惩罚进程与实模式类丁当前的CS; IP值和符号寄存器值被存储。生存的内容还包罗CPU其他内部寄存器的值,以及今朝正在被执行的任务的有关信息(若必需产生任务切换的话)。CPU设法获取间断向量后,以它为索引值查找IDT中的处事例程远地点,接着将节制转移到该处的处事例程。这是与实模式转移到IVT的差异地址。掩护模式利用IDTR寄存器分派和定位内存中的IDT间断描写符表。
#p#分页标题#e#
IDT在内存中是可移动的,与IVT牢靠在内存中恰好相反。 IDT间断描写符表在 Windows中起抉择性的浸染。领略了windows掩护模式的间断机制。有助于我们领略间断处事措施的设计,它的要害就在于如何将处事例程的地点放入IDT间断描写符表中。傍边断产生时,如何将断点地点及CPU各寄存器值掩护起来,间断竣事时,如何将掩护的值规复。 windows系统自己并不提供实现上述成果的API,而DOS掩护模式接口DPMI正具备了上述的成果。
下面我们首先先容DPMI接口,然后基于它实现Windows下间断处事措施的设计。
四、DOS掩护模式接口
DMPI Windows除了尺度处事外,还支持一组非凡的DOS处事,称为DOS掩护模式接口 DPMI,由一些INT2FH和INT31H处事构成。它使应用措施可以或许会见 PC系列计较机的扩充内存,同时维护系统的掩护成果。 DPMI通过软件间断31h来界说了一个新的接口,使得掩护模式的应用措施可以或许用它作分派内存,修改描写符以及挪用实模式软件等事情。
Windows为应用措施提供 DPMI处事。即Windows是DPMI的宿主(host),应用措施是DPMI的客户(client),可通过INT31H挪用获得DPMI处事。INT 31H自己提供多成果。个中它的间断打点处事答允掩护模式用于拦截实模式间断,而且挂住处理惩罚器异常。有些处事可以或许和 DPMI宿主相助,以维护应用措施的虚拟间断符号。
可以用INT31H来挂住掩护模式间断向量,以间断方法处理惩罚外部及时事件。操作 INT 21H,成果0205H:配置掩护模式间断向量,将特定间断的掩护模式处理惩罚措施的地点置入间断向量里。挪用方法:
AX=0205H,BL=间断号,CX:(E)DX=间断处理惩罚措施选择符:偏移值。返回:执行乐成CF=清零,执行失败CF,置位。
挂住/解挂间断向量的机缘很重要。主窗口第一次被建设时会传送它WM—CREATE动静,这时是挂住间断向量的最好机缘。退出时需解挂向量,不然Windows大概瓦解。上窗口吸收到WM_DESTROY之后举办解挂事情,是最适合的。解挂向量可先用INT35H,0204H成果将老的间断向量生存,退出时用INT35H,0205H规复。
五、编程实现
有了DPMI的支持,我们就可以很利便地处理惩罚数据收罗、串行通信等家产进程中的及时事件。下面以Windows3.1平台下间断方法实现的串行通信为例,说明间断措施的体例和实现。为便于参考,给出了具体的代码。开拓平台BC3.1/BC4.5,其自己支持0.9版的DPMI,无需运行其它支持DPMI的软件。编程语言C,可与C++殽杂编译。
初始化COM1,9600波特率,每字符8bits,1个遏制位,间断吸收,查询发送。
//windows asy COmmunica60n
//by Li Xiumi98
//last modified on June25,1996
#include<windows.h>
#include<dos.h>
void interrupt far DataReceive() ;
void interrupt far( * old_vector)();
unsigned char dataCom_r[1024],datacom_s[1024]:
int inflag=0 ;
unsigned int s8259;
int InitCom1()
{
s8259=inportb(0x21);
outportb(0x21,s8259&0xe8);
outportb(0x3fb,0x83);
outportb(0x3f8,0x0c);
outportb(0x3f9,0x00);
outportb(0x3fb,0x03);
outportb(0x3fc,0x08);
outportb(0x3f9,0x01);
return 1;
}
void interrupt far DataReceive()
{
static int i=0 ;
char rechar =0 ;
rechar=inportb(0x3f8);
if(inflag==0)
{
if(rechar!='s'&&i==0)
{
i=0;
goto l1;
}
datacom_r[i++]=rechar;
if(rechar=='e')
{
inflag=1;
i=0;
}
}
l1:outportb(0x20,0x20);
}
void InitCom(void)
{
asm{
cli;
mov ax,204h
mov bl,0ch
int 31h
sti
}
old_vector=MK_FP(_CX,_DX);
asm{
cli
mov ax,205h
mov bl,0ch
mov cx,seg datareceive
mov dx,offset datareceive
int 31h
sti
}
InitCom();
}
void restore_Comm(void)
{
outportb(0x21,s8259);
asm{
cli
mov ax,205h
mov bl,0ch
mov cx,seg old_vector
mov dx,offset old_vector
int 31h
sti
}
}
在窗口第一次被建设时会传送它WM_CREATE动静,这时挪用initCom()即可。在主窗口封锁时,即主窗口中收到 WM_DESTROY动静时,挪用Restore Comm()规复本来的状态。
这样在对串口初始化,配置间断处事例程后,通信事件产生时,会当即跳入间断子措施中执行,越过系统的动静行列,到达及时处理惩罚通信事件的目标。而数据处理惩罚模块可通过全局符号f1,8会见全局的数据通信缓冲区获取及时数据。
#p#分页标题#e#
这种实现方法与基于动静机制的Windows通信API实现对比具有及时性强的的特点,因为它高出了Windows 系统的南北极动静机制,上述措施已在实际系统中获得应用。在windows3.1支持下同时运行三个Windows任务,处事器SERVER(内有及时串行通信,多个网络数据子处事,),客户CLIENT,FOXPRO数据库系统。整个系统运行精采。切换到WIN95平台下,系统也运行精采 。