Service de noyau xmalloc

Objectif

Allère de la mémoire.

Syntaxe

#include <sys/types.h>
#include <sys/errno.h>
#include <sys/malloc.h>
caddr_t xmalloc ( size,  align,  heap)
int size;
int align;
caddr_t heap;

Paramètres

Article Descriptif
Taille Indique le nombre d'octets à allouer.
aligner Indique les caractéristiques d'alignement de la mémoire allouée.
tas Indique l'adresse du segment de mémoire à partir duquel la mémoire doit être allouée.

Descriptif

Le service de noyau Xmalloc alloue une zone de mémoire sur le segment de mémoire spécifié par le paramètre Segment de mémoire . Cette zone est le nombre d'octets de longueur spécifié par le paramètre Taille et correspond à la limite d'octets spécifiée par le paramètre Aligner . Le paramètre Aligner est en fait la base de journal 2 de la limite d'adresse souhaitée. Par exemple, une valeur Aligner de 4 demande que la zone allouée soit aligné sur une limite de 2 ^ 4 (16) octets.

Il y a plusieurs tas de tas fournis par le noyau pour l'utilisation par les extensions de noyau. Deux segments de noyau principaux sont Kernel_heap et Pinned_heap. Les extensions de noyau doivent utiliser la valeur Kernel_heap lors de l'allocation de mémoire qui n'est pas réservée et utiliser la valeur Pinned_heap lors de l'allocation de mémoire qui doit toujours être réservée ou réservée pendant de longues périodes. Lors de l'allocation à partir du segment de mémoire Pinned_heap , le service de noyau Xmalloc broche la mémoire avant une reprise réussie. Les services de noyau Broche et épinglette doivent être utilisés pour épinglette et démettre la mémoire du segment de mémoire Kernel_heap lorsque la mémoire ne doit être réservée que pour une durée limitée. La mémoire du segment de mémoire Kernel_heap doit être débloque avant de la libérer. La mémoire du segment de mémoire Pinned_heap ne doit pas être débloque.

Le segment de mémoire Kernel_heap pointe vers l'une des segments de mémoire suivants: kernel_heap_4K_64K et kernel_heap_16M. Le segment de mémoire Pinned_heap pointe vers l'une des segments de mémoire suivants: pinned_heap_4K_64K et pinned_heap_16M. Chacun des segments de la cible diffère selon la taille des pages qui les sauvegardez-les. kernel_heap_4K_64K ou pinned_heap_4K_64K seront pris en charge par les pages de support (64 ko) ou régulières (4 ko), en fonction de la taille de page prise en charge par la machine. kernel_heap_16M ou pinned_heap_16M renvoie une mémoire sauvegardée par de grandes pages si les segments de page de grande taille sont activés. Si les segments de page de grande taille ne sont pas activés, Kernel_heap ou Pinned_heap pointe vers le segment de mémoire par défaut. Si la taille des pages de support n'est pas importante, utilisez la valeur Kernel_heap et la valeur Pinned_heap . Ils pointent vers le segment de mémoire que vous préférez. Pour plus d'informations sur la prise en charge des segments de page de grande taille, voir Vmo.

Les extensions de noyau peuvent utiliser ces services pour allouer de la mémoire à partir des segments de mémoire du noyau. Par exemple, le service de noyau xmalloc (128,3,kernel_heap) alloue une zone alignée sur deux mots de 128 octets à partir du segment de mémoire du noyau.

Une extension de noyau doit utiliser le service de noyau Xmfree pour libérer la mémoire allouée. Si ce n'est pas le cas, les allocations subséquentes finissent par être infructueuses.

Le service de noyau Xmalloc possède deux interfaces de compatibilité: Malloc et Palloc.

Les interfaces supplémentaires suivantes sont fournies avec le service de noyau Xmalloc :

  • Malloc (Taille) est équivalent à Xmalloc (Taille, 0, Kernel_heap).
  • Palloc (Taille, Aligner) est équivalent à Xmalloc (Taille, Aligner, Kernel_heap).

Environnement d'exécution

Le service de noyau Xmalloc peut être appelé à partir de Environnement de processus uniquement.

Valeurs renvoyées

Une fois l'exécution terminée, le service de noyau Xmalloc renvoie l'adresse de la zone allouée. Un pointeur null est renvoyé dans les cas suivants:

  • La mémoire demandée ne peut pas être allouée.
  • Le segment de mémoire n'a pas été initialisé pour l'allocation de mémoire.