Alloue Mémoire Partagée
![[1.0]](../1.0.gif)
Alloue un bloc de mémoire qui doit être partagé par les clients DPMI .
Appel avec

AX = 0D00H
ES:(E)DI = selecteur:offset de la structure de requète d'allocation
de mémoire partagée au format suivant:
Offset | Longueur | Contenu |
00H | 4 | Longueur requise du bloc de mémoire partagée (fixé par le client, peut être nulle) |
04H | 4 | Longueur actuellement allouée (fixé par l'hôte) |
08H | 4 | Handle mémoire partagée (fixé par l'hôte) |
0CH | 4 | Adresse linéaire du bloc de mémoire partagée (fixé par l'hôte) |
10H | 6 | offset32:selecteur d' ASCIIZ (null-terminated ASCII) nom du bloc de mémoire partagée (fixé par le client) |
16H | 2 | Reservé |
18H | 4 | Reservé, doit être zéro |
Retourne

si la fonction réussit
Carry flag = 0
et les champs de la structure de requète aux offsets 04H, 08H, et
0CH mis à jour par l'hôte
si la fonction échoue
Carry flag = 1
AX = code d'erreur
8012H | adresse linéaire indisponible |
8013H | mémoire physique indisponible |
8014H | backing store indisponible |
8016H | handle indisponible |
8021H | valeur invalide (nom du bloc mémoire
est trop long) |
et les champs de la structure de requète aux offsets 04H, 08H, et
0CH non mis à jour par l'hôte
Notes
- Pour les programmes 16-bit , Le mot fort de l' offset32 pour le nom
ASCIIZ doit être zéro.
- La longueur maximum du nom du bloc de mémoire partagée est de 128
caractères, incluant le caractère terminal nul.L'adresse linéaire fournie par l'hôte est garantie pour être la
même pour tous les clients dans toutes les machines virtuelles qui utilisent
bloc de mémoire partagée. Le client doit établir l'addressabilité du bloc
en allouant et initialisant un descripteur avec des appels de fonction
separés.
- Aucune supposition ne peut être faite sur les valeurs de handle .
Les allocations successives du même bloc de mémoire partagée par le même
client doivent renvoyer des handles distincts ; le client est responsable
de la gestion de chaque handle.
- Le premier client qui alloue un bloc de mémoire partagée en determine
la taille; la longueur requise et la longueur actuellement allouée doivent
toujours être égales, si l'allocation réussit. Des allocations consécutives
par le même ou par des clients différents qui specifient la même ou une taille
différente réussiront, mais la taille du bloc restera inchangée .
La taille actuelle du bloc est toujours renvoyée au client à l'offset 4
dans la structure de requète.
- L'allocation d'un bloc de mémoire partagées de longueur nulle est
explicitement autorisé. Son handle peut être utilisé avec les fonctions
de sérialisation (Int 31H Fonctions
0D02H et 0D03H) comme un sémaphore pour la
communication inter-client. L'adresse linéaire qui est retournée à
l'offset 0CH dans la structure pour les blocs de longueur nulle est indéfinie,
et toute référence à cette adresse produira une faute de page.
- Le premier paragraphe (16 octets) du bloc de mémoire partagée (ou le
bloc partagé entier , si inférieur à 16 octets) sera toujours initialisé
à zéro à la première allocation et pourra être utilisé par les clients
comme un indicateur de "zone initialisée" . Par exemple, un bloc de
mémoire partagée pourra être utilisé par une suite de programmes client
coopérant pour accéder à une table de données statiques ou une librairie
de sous-routines. Le premier client à allouer le bloc de mémoire partagée
peut en obtenir la propriété exclusive avec l'Int 31H Fonction 0D02H
, charger les données ou le code nécessaires dans le bloc en provenance du
disque, fixer les 16 premier octets du bloc à une valeur non nulle,et
finalement libérer la propriété du bloc avec l' Int 31H Fonction
0D03H. Les autres clients qui allouent le bloc de mémoire partagée peuvent
tester l'indicateur de "zone initialisée" et savoir si les données ou le code
sont déjà présents en mémoire.
- Les allocations et serialisations des blocs de mémoire partagée
sont pistés par l'hôte sur une base par client . Toutes les allocations
de mémoire partagée pour un client sont libérées par l'hôte quand le client
se termine.