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 ; 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