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:

Tous ces changements de mode excepté les "raw" doivent sauvegarder quelque information sur la pile de l'hôte DPMI. Cela signifie que le client ne doit pas se terminer dans des changements de mode imbriqués … moins qu'il utilisent les fonctions "raw" . Quoiqu'il en soit, même les clients qui emploient les fonctions "raw" ne doivent pas essayer de terminer aprŠs une interruption materielle,un gestionnaire d'exception ou un callback mode réel car l'hôte DPMI gŠre automatiquement les changements de mode et de pile pendant ces évŠnements.

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                 ; state save/restore point d'entrées
	mov	savsiz,ax		; save state info buffer size
	mov	word ptr realsrs,cx	; BX:CX = state save/restore
        mov     word ptr realsrs+2,bx   ; point d'entrée for real mode
	mov	word ptr protsrs,di	; SI:DI = state save/restore
        mov     word ptr protsrs+2,si   ; point d'entrée for mode protégé

	mov	ax,306h			; get address of DPMI host's
        int   31h                 ; raw mode switch point d'entrées
	mov	savsiz,ax		; save state info buffer size
	mov	word ptr realrms,cx	; BX:CX = raw mode switch
	mov	word ptr realrms+2,bx	; entry piont for real mode
	mov	word ptr protrms,di	; SI:DI = raw mode switch
        mov     word ptr protrms+2,si   ; point d'entrée for mode protégé
					; must also initialize the
                                        ; sp et realss variables
	.
	.
	.

					; this code is executed during
					; program execution
callopenfile proc
        pusha                           ; save mode protégé registers
	push	es

        sub     sp,savsiz               ; alloue space on current pile
	mov	di,sp			; to save real mode state
	mov	ax,ss			; set ES:DI = address of buffer
	mov	es,ax			; to receive state information
	xor	al,al			; AL=0 for save state request
	call	protsrs			; call state save/restore routine

	mov	protds,ds		; save current DS for switch back
	mov	protss,ss		; save current SS
	mov	protsp,sp		; save current SP
	mov	protip,offset returnfromreal ; save return IP
	mov	protcs,cs		; save return CS

	mov	ax,seg filename		; load real mode DS
	mov	ds,realss		; load real mode SS
	mov	bx,realsp		; load real mode SP
	mov	si,seg openfile		; load real mode CS
	mov	di,offset openfile	; load real mode IP
	
	jmp	protrms			; go to openfile

returnfromreal:
	mov	ax,ss			; let ES:DI = address of buffer
	mov	es,ax			; holding state information
	mov	di,sp
	mov	al,1			; AL=1 to restore state
	call	protsrs			; call state restore routine
	add	sp,savsiz		; discard state info buffer
	pop	es
        popa                            ; restore mode protégé registers
	ret
callopenfile endp

	.
	.
	.
	
					; this code is executed in real mode
openfile proc
	mov	dx,offset filename
	mov	ah,3dh			; issue Open File DOS call
	int	21h
	jc	openerr			; check for error (not shown here)
	mov	filehandle,bx		; save file handle
        mov     ax,protds               ; load mode protégé DS
        mov     dx,protss               ; load mode protégé SS
        mov     bx,protsp               ; load mode protégé SP
        mov     si,protcs               ; load mode protégé CS
        mov     di,protip               ; load mode protégé IP
	jmp	realrms

openfile endp