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