A un point ou un autre de son execution ,tout client DPMI s'exécute sur quatre piles differentes: une pile d'application, une pile verrouillée en mode protégé , une pile mode réel,et la pile de l'hôte DPMI . Il est important de comprendre comment l'hôte gère ces piles pour bien assimiler l'environnement en mode protégé .
La pile d'application est la première que le client DPMI exécute. C'est initiallement la pile en mode réel que le client emploie avant de basculer en mode protégé, bien que rien ne le previenne après le changement de mode . La pile d'application peut être deverrouillée si desiré. Les interruptions logicielles executées en mode protégé se servent de cette pile.
La pile verrouillée en mode protégé est fournie par l'hôte DPMI. L'hôte bascule automatiquement sur cette pile pendant les interruptions matérielles, interruptions logicielles 1CH, 23H, et 24H,toutes les exceptions, et pendant l'exécution des callbacks mode réel. Les interruptions imbriquées ou les appels ne provoquent pas de changement de pile. Si le client arrète cette pile, la nouvelle doit être verrouillée et devient la pile en mode protégé jusqu'a ce qu'il revienne en arrière . Lors du retour d'une interruption ou d'un appel, l'hôte bascule sur la pile originale en mode protégé. Notez que l'hôte doit fournir une pile verrouillée d'un d'un minimum de 4 Ko, et que les interruptions logicielles autres que 1CH, 23H, et 24H n'utilisentPAS cette pile.
La pile mode réel est également fournie par l'hote DPMI, et est usuallement située dans la zone de données de l'hôte DPMI allouée par le client avant so passage en mode protégé. La pile mode réel a au moins une taille de 200H octets et est toujours placée en memoire verrouillé. Les interruptions qui sont renvoyées au mode réel , ainsi que les appels aux gestionnaires d'interruptions en mode réel ou les procedures via Int 31H Fonctions 0300H, 0301H, ou 0302H, utilisent cette pile.
La pile de l'hôte DPMI est seulement accessible à l'hôte DPMI; elle est utilisée par l'hôte pour gerer les interruptions et exceptions que l'hôte exécute pour le compte du client. Par exemple, quand le client requiert un changement de mode , l' original SS:(E)SP du programme en mode protégé peut être préservé sur la pile de l'hôte pendant que l'hôte DPMI bascule sur la pile verrouillé en mode protégé.
Il y a quatre manières différentes pour un client de forcer un changement de mode entre mode protégé et mode réel:
Les clients qui utilisent les services de changements de mode "raw" et qui pratiquent des changements de mode imbriqués doivent utiliser les fonctions DPMI de sauvegarde/restauration dont les adresses sont obtenues avec Int 31H Fonction 0305H), ce qui amène l'hôte à conserver l'information sur l'état courant de "l'autre" mode. Cette information inclue CS:(E)IP,SS:(E)SP, et les autres contenus des registres de segment ; valeurs que le client ne peut pas acceder directement. Par exemple, pendant une inte0rrption matérielle qui survient en mode réel, l'hôte DPMI peut preserver CS:(E)IP, SS:(E)SP en mode réel et les registres de segment sur sa propre pile provoquant un retour à une mauvaise adresse quand le gestionnaire execute l'instruction IRET finale.
Exemple: Cet exemple illustre le code qui sauvegarde l'état des registres en mode réel en utilisant la fonction DPMI de sauvegarde/restauration,bascule en mode réel en utilisant la fonction "raw" ,envoie un appel DOS d'ouverture de fichier,repasse en mode protégé,en utilisant la fonction "raw", et restaure l'état des registres en mode réel en utilisant les fonctions de sauvegarde/restauration. Les registres en mode protégé sont preservés sur la pile de manière usuelle. Cet exemple est seulement destiné à montrer la sequence logique d'éxecution; dans un programme réel, les variables et fonctions mode réel/protégé devrait être réparties dans des segments separés.
savsiz dw 0 ; taille de l'état
realsrs dd 0 ; pointeur far mode réel
; point d'entrée de sauvegarde/restauration
protsrs dd 0 ; pointeur far mode protégé
; point d'entrée de sauvegarde/restauration
realrms dd 0 ; pointeur far mode réel
; point d'entrée "raw" mode
protrms dd 0 ; pointeur far mode protégé
; point d'entrée "raw" mode
protdw dw 0 ;emplacement pour DS en mode protégé
protip dw 0 ;emplacement pour IP enmode protégé
protcs dw 0 ;emplacement pour CS en mode protégé
protsp dw 0 ;emplacement pour SP en mode protégé
protss dw 0 ;emplacement pour SS en mode protégé
.
.
.
; Ce code est executé pendant
; l'initialisation de l'application
mov ax,305h ; obtient l'addresse of DPMI host's
int 31h ; point d'entrée etat de sauvegarde/restauration
mov savsiz,ax ; taille du buffer d'etat
mov word ptr realsrs,cx ; BX:CX =etat de sauvegarde/restauration
mov word ptr realsrs+2,bx ; point d'entrée du mode reel
mov word ptr protsrs,di ; SI:DI = etat de sauvegarde/restauration
mov word ptr protsrs+2,si ; point d'entrée du mode protégé
mov ax,306h ; obtient l'adresse de l'hote DPMI
int 31h ; point d'entrées mode raw
mov savsiz,ax ; sauvegarde taille du buffer d'etat
mov word ptr realrms,cx ; BX:CX = point d'entrée mode raw
mov word ptr realrms+2,bx ; point d'entrée mode reel
mov word ptr protrms,di ; SI:DI = raw mode switch
mov word ptr protrms+2,si ; point d'entrée du mode protégé
; on doit aussi initialiser les
; variables sp et realss
.
.
.
; ce code est execute durant
; l'execution du programme
callopenfile proc
pusha ; sauvegarde registres mode protégé
push es
sub sp,savsiz ; alloue espace sur la pile courante
mov di,sp ; pour sauvegarder l'etat mode reel
mov ax,ss ; set ES:DI = adresse du buffer
mov es,ax ; qui recoit l'information d'etat
xor al,al ; AL=0 requete de sauvegarde d'etat
call protsrs ; appel de la routine de sauvegarde/restauration
mov protds,ds ; sauve DS pour switch back
mov protss,ss ; sauve SS courant
mov protsp,sp ; sauve SP courant
mov protip,offset returnfromreal ; sauve IP return
mov protcs,cs ; sauve CS return
mov ax,seg filename ; charge DS mode reel
mov ds,realss ; charge SS mode reel
mov bx,realsp ; charge SP mode reel
mov si,seg openfile ; charge CS mode reel
mov di,offset openfile ; charge IP mode reel
jmp protrms ; appel ouverture de fichier
returnfromreal:
mov ax,ss ; ES:DI = adresse du buffer
mov es,ax ; qui recoit l'information d'etat
mov di,sp
mov al,1 ; AL=1 pour restaurer l'etat
call protsrs ; appel de la routine de sauvegarde
add sp,savsiz ;
pop es
popa ; restaure registres mode protégé
ret
callopenfile endp
.
.
.
; ce code est execute enn mode reel
openfile proc
mov dx,offset filename
mov ah,3dh ; fonction DOS d'ouverture
int 21h
jc openerr ; test d'erreur
mov filehandle,bx ; sauvegarde handle
mov ax,protds ; charge DS mode protégé
mov dx,protss ; charge SS mode protégé
mov bx,protsp ; charge SP mode protégé
mov si,protcs ; charge CS mode protégé
mov di,protip ; charge IP mode protégé
jmp realrms
openfile endp