Partager via


Allocation de mémoire System-Space

Important

Les DDIS ExAllocatePool décrites dans cette rubrique ont été dépréciées dans Windows 10 version 2004 et ont été remplacées par ExAllocatePool2 et ExAllocatePool3. Pour plus d’informations, consultez Mise à jour des appels ExAllocatePool déconseillés vers ExAllocatePool2 et ExAllocatePool3.

Les pilotes peuvent utiliser l’espace alloué par le système dans leurs extensions de périphérique comme zones de stockage globales pour les informations spécifiques aux appareils. Les pilotes peuvent utiliser uniquement la pile du noyau pour transmettre de petites quantités de données à leurs routines internes. Certains pilotes doivent allouer des quantités supplémentaires de mémoire d’espace système, généralement pour les mémoires tampons d’E/S.

Pour allouer de l’espace tampon d’E/S, les meilleures routines d’allocation de mémoire à utiliser sont MmAllocateNonCachedMemory, MmAllocateContiguousMemorySpecifyCache, AllocateCommonBuffer (si l’appareil du pilote utilise le bus-master DMA ou le mode d’initialisation automatique d’un contrôleur DMA système) ou ExAllocatePoolWithTag.

Le pool non paginé devient généralement fragmenté à mesure que le système s’exécute. Par conséquent, la routine DriverEntry d’un pilote doit appeler ces routines pour configurer toutes les mémoires tampons d’E/S à long terme dont le pilote a besoin. Chacune de ces routines, à l’exception d’ExAllocatePoolWithTag, alloue de la mémoire alignée sur une limite spécifique au processeur (déterminée par la taille de ligne de cache de données du processeur) pour fournir de meilleures performances.

Les pilotes doivent allouer des mémoires tampons d’E/S aussi économiquement que possible, car la mémoire du pool non paginé est une ressource système limitée. En règle générale, un pilote doit éviter d’appeler ces routines de support à plusieurs reprises pour demander des allocations inférieures à PAGE_SIZE, car chaque allocation inférieure à PAGE_SIZE est également fournie avec un en-tête de pool utilisé pour gérer l’allocation en interne.

Conseils pour l’allocation économique de l’espace tampon du pilote

Pour allouer de la mémoire tampon d’E/S de manière économique, tenez compte des points suivants :

  • Chaque appel à MmAllocateNonCachedMemory ou MmAllocateContiguousMemorySpecifyCache renvoie toujours un multiple complet de la taille de page du système, de la mémoire de l’espace système non paginé, quelle que soit la taille de l’allocation demandée. Par conséquent, les demandes de moins d’une page sont arrondies à une page entière et les octets restants de la page sont gaspiller ; elles sont inaccessibles par le pilote qui a appelé la fonction et sont inutilisables par d’autres codes en mode noyau.

  • Chaque appel à AllocateCommonBuffer utilise au moins un registre de mappage d’objets d’adaptateur, qui mappe au moins un octet et au plus une page. Pour plus d’informations sur les registres cartographiques et l’utilisation de mémoires tampons communes, consultez Objets adaptateurs et DMA.

Allocation de mémoire avec ExAllocatePoolWithTag

Les pilotes peuvent également appeler ExAllocatePoolWithTag, en spécifiant l’une des valeurs de POOL_TYPE définies par le système pour le paramètre PoolType :

  • PoolType = NonPagedPool pour tous les objets ou ressources non stockés dans une extension de périphérique ou une extension de contrôleur auxquelles le pilote peut accéder pendant qu’il s’exécute sur irQL > APC_LEVEL.

    Pour cette valeur PoolType , ExAllocatePoolWithTag alloue la quantité de mémoire demandée si la valeur NumberOfBytes spécifiée est inférieure ou égale à PAGE_SIZE. Sinon, tous les octets restants sur la dernière page allouée sont gaspiller : inaccessibles à l’appelant et inutilisables par un autre code en mode noyau.

    Par exemple, sur un x86, une demande d’allocation de 5 kilo-octets (Ko) retourne deux pages de 4 Ko. Les 3 derniers Ko de la deuxième page ne sont pas disponibles pour l’appelant ou un autre appelant. Pour éviter de gaspiller le pool non paginé, le pilote doit allouer plusieurs pages efficacement. Dans ce cas, par exemple, le pilote peut effectuer deux allocations, l’une pour PAGE_SIZE et l’autre pour 1 Ko, pour allouer un total de 5 Ko.

    Note À compter de Windows Vista, le système ajoute automatiquement la mémoire supplémentaire afin que deux allocations soient inutiles.

  • PoolType = PagedPool pour la mémoire toujours accessible à l’adresse IRQL <= APC_LEVEL et qui n’est pas dans le chemin d’écriture du système de fichiers.

ExAllocatePoolWithTag retourne un pointeur NULL s’il ne peut pas allouer le nombre d’octets demandé. Les pilotes doivent toujours case activée le pointeur retourné. Si sa valeur est NULL, la routine DriverEntry (ou toute autre routine de pilote qui retourne des valeurs NTSTATUS) doit retourner STATUS_INSUFFICIENT_RESOURCES ou gérer la condition d’erreur si possible.