DosAllocMem |
Allocation mémoire |
---|---|
DOSCALLS.DLL | os2.h |
Syntaxe
APIRET DosAllocMem( PPVOID pBaseAddress, ULONG ulObjectSize, ULONG ulAllocationFlags ); |
Paramètres
Nom | Description | ||
---|---|---|---|
pBaseAddress | Ce paramètre permet d'indiquer un pointeur vers une variable recevant l'adresse de base d'un objet d'allocation de mémoire privé. | ||
ulObjectSize | Ce paramètre permet d'indiquer la taille en octets d'un bloc de mémoire devant être alloué. | ||
ulAllocationFlags | Ce paramètre permet d'indiquer les drapeaux de description d'allocation d'attribut pour l'accès protégé d'un bloc de mémoire privé. Voici les valeurs pouvant être combiné : | ||
Constante | Valeur | Description | |
PAG_READ | 0x00000001 | Cette valeur permet d'indiquer qu'il faut autorisé un accès en lecture au pages de bloc de mémoire. | |
PAG_WRITE | 0x00000002 | Cette valeur permet d'indiquer qu'il faut autorisé un accès l'écriture au pages de bloc de mémoire. | |
PAG_EXECUTE | 0x00000004 | Cette valeur permet d'indiquer qu'il faut autorisé un accès d'exécution au pages de bloc de mémoire. | |
PAG_GUARD | 0x00000008 | Cette valeur permet d'indiquer qu'il faut autorisé un accès système au pages de bloc de mémoire afin qu'un gardien de processus d'exception puisse y accéder. | |
PAG_COMMIT | 0x00000010 | Cette valeur permet d'indiquer que tous les bloc de mémoire privé sont initialisés. | |
OBJ_TILE | 0x00000040 | Cette valeur permet de forcer l'allocation d'un bloc de mémoire dans les 512 premier mégaoctets de l'espace d'adressage virtuel. |
Retour
Valeur | Constante | Description |
---|---|---|
0 | NO_ERROR | Cette valeur permet d'indiquer que l'opération s'est correctement effectué |
8 | ERROR_NOT_ENOUGH_MEMORY | Cette valeur permet d'indiquer que la limite de mémoire système est atteinte. |
87 | ERROR_INVALID_PARAMETER | Cette valeur permet d'indiquer qu'un ou plusieurs des paramètres contient une valeur illégale. |
95 | ERROR_INTERRUPT | Cette valeur permet d'indiquer qu'une erreur d'interruption s'est produite. |
Description
Cette fonction permet d'utiliser une allocation d'objet de mémoire privé dans les limites d'espace d'adressage virtuel.
Remarques
- L'accès en écriture implique à la fois l'accès en lecture et l'exécution du code.
- L'attribut de page de garde peut être utilisé lorsque la croissance automatique de la pile est souhaitée. Lorsque cet attribut est utilisé, la première page de l'objet mémoire est marquée comme page de garde. Le système générera une exception de page de garde lors d'une tentative d'accès à une page validée marquée comme page de garde. Le comportement par défaut du gestionnaire d'exceptions système consiste à supprimer l'attribut de page de garde de la page et à tenter de valider et de marquer la page suivante (la page précédente car le système la traite comme une pile) comme page de garde. Si le système ne peut pas marquer et valider la page suivante, il générera une exception XCPT_UNABLE_TO_GROW_STACK et terminera le processus léger. Une application peut remplacer sa propre gestion des exceptions par DosSetExceptionHandler.
- À moins que l'option NOSWAP soit utilisée pour l'instruction MEMMAN dans CONFIG.SYS, vos pages peuvent être échangées sur le disque. Actuellement, il n'y a aucun moyen via les API de définir une page protégée ne pouvant pas être échangée.
- Sauf si l'indicateur PAG_COMMIT est utilisé, l'objet mémoire alloué n'aura qu'un espace d'adressage linéaire réservé. La mémoire doit être validée avant de pouvoir être utilisée.
- Les pages validées sont initialement sauvegardées sur des pages de demande. Les pages de demande sont des pages de mémoire physique existant à la fois dans la RAM et dans le fichier d'échange. La première tentative de lecture ou d'écriture sur la page entraînera la validation et l'initialisation de la page de demande avec des 0. Il est possible de valider des pages avec succès, puis d'obtenir une violation d'accès lorsque vous essayez de les utiliser, car elles ne sont réellement validées qu'après leur première utilisation. Malheureusement, c'est pourquoi OS/2 peut devenir instable lorsque le fichier d'échange est alors plein. Vous pouvez vous assurer que vos pages existeront lorsque vous les validerez en définissant l'option COMMIT pour l'instruction MEMMAN dans le fichier CONFIG.SYS, cependant, cette situation nécessite une énorme quantité de RAM.
Exemple
Voici un simple exemple montrant comme appeler cette API avec WatCom C++ for OS/2 :
- #define INCL_DOSERRORS
- #define INCL_DOSMEMMGR
- #include "os2.h"
- #include "stdio.h"
-
- void main(void) {
- PVOID BaseAddress;
- switch(DosAllocMem(&BaseAddress, 8000, PAG_WRITE | PAG_EXECUTE)) {
- case NO_ERROR: printf("Tout va bien !");break;
- case ERROR_NOT_ENOUGH_MEMORY: printf("Erreur : La limite de mémoire système est atteinte.");break;
- case ERROR_INVALID_PARAMETER: printf("Erreur : Un ou plusieurs des paramètres contient une valeur illégale.");break;
- case ERROR_INTERRUPT: printf("Erreur : Une erreur d'interruption s'est produite.");break;
- }
- }
Voir également
Langage de programmation - C pour OS/2 - DosAllocSharedMem
Langage de programmation - C pour OS/2 - DosFreeMem
Système d'exploitation - OS/2 - Introduction
Dernière mise à jour : Lundi, le 19 juillet 2010