Table des matières du Be Book | Index du kit du Noyau |
Déclarations dans : be/kernel/OS.h
Librairie : libroot.so
Une area est un gros morceau de mémoire virtuelle qui peut être partagé entre threads (de différentes teams, peut-être). Si votre application a besoin d'allouer de grands blocs de mémoire, ou veut partager beaucoup de données avec une autre application, vous devriez envisager l'usage d'une area.
Pour plus d'informations sur les areas, consultez "Concepts des areas".
Pour des exemples de créations et de partage d'areas, consultez "Exemples d'usage d'une area".
|
Retourne l'area qui contient l'adresse donnée (dans l'espace d'adresse de votre propre team). L'argument n'a pas besoin d'être l'adresse de début d'une area, ni d'être sur une limite de page mémoire : si l'adresse se trouve n'importe où dans une des areas de votre application, l'ID de cette area est retournée.
Puisque l'adresse est considérée dans l'espace d'adresse local, l'area qui est retournée sera également locale—elle aura été crée ou clonée par votre application.
CODES DE RETOUR
Voir aussi : find_area()
|
Créer une nouvelle area (l'area clone) qui repose dans la même mémoire physique qu'une area pré-existante (l'area source).
La quatrième constante, B_CLONE_ADDRESS, indique que l'adresse de l'area clonée doit être la même que l'adresse de l'area source. Cloner l'adresse est commode si vous avez deux (ou plus) applications qui veulent s'échanger des pointeurs entre elles—en utilisant des adresses clonées, les applications n'ont pas à compenser les pointeurs qu'elles reçoivent. Pour les constantes B_ANY_ADDRESS et B_CLONE_ADDRESS, la valeur en entrée pointée par clone_addr est ignorée.
L'area clonée hérite du schéma de verrouillage de l'area source.
Habituellement, l'area source et l'area clonée sont dans deux applications différentes. Il est possible de cloner une area depuis une area source existante dans la même application, mais il n'y a pas beaucoup de raison de faire ça sauf si vous voulez des protections différentes sur ces areas.
Si clone_area() réussie, l'area_id du clone est retournée. Sinon, elle retourne un code d'erreur descriptif, listé ci-dessous.
CODES DE RETOUR
Voir aussi : create_area()
|
Créer une nouveau area et retourne son area_id.
/* Initialiser l'adresse à une limite de page. */ char * addr = (char *)(B_PAGE_SIZE * 100); /* Passez l'adresse de addr comme second argument. */ create_area( "my area", &addr, ...);
La fonction modifie la valeur de *addr à l'adresse réelle de début de l'area—elle peut être différente de celle que vous aviez demandé. La consistance de *addr dépend de la valeur de addr_spec, comme expliqué tout de suite.
Constante | Signification |
---|---|
B_EXACT_ADDRESS | Vous voulez que la valeur de *addr soit prise littéralement et strictement. Si l'area ne peut pas être allouée à cette adresse, la fonction échoue. |
B_BASE_ADDRESS | L'area peut démarrer à une adresse égale ou supérieure à *addr. |
B_ANY_ADDRESS | L'adresse de début est déterminée par le système. Dans ce cas, la valeur pointée par addr est ignorée (en entrée de fonction). |
B_ANY_KERNEL_ADDRESS | L'adresse de début est déterminée par le système, et la nouvelle area appartiendra à la team du Noyau; elle ne sera pas détruite lorsque l'application se terminera. Dans ce cas, la valeur pointée par addr est ignorée (en entrée de fonction). |
B_CLONE_ADDRESS | N'est significatif que pour la fonction clone_area(). |
Constante | Signification |
---|---|
B_FULL_LOCK | La mémoire est verrouillée dans la RAM lors de la création de l'area, et ne sera jamais swappée. |
B_CONTIGUOUS | Non seulement la mémoire de l'area est verrouillée en RAM, mais elle est aussi garantie d'être contigue. C'est particulièrement—et peut-être exclusivement—utile pour les concepteurs de certains types de pilotes de périphériques. |
B_LAZY_LOCK | Des pages individuelles de mémoire sont amenées en RAM dans l'ordre naturel des choses et alors verrouillées. |
B_NO_LOCK | Les pages ne sont jamais verrouillées, elles sont amenées en RAM ou descendues (swappées) sur disque selon le besoin. |
B_LOMEM | C'est une constante spéciale, utilisée pour les areas qui doivent être verrouillées, contigues, et résider dans les premiers 16 Mo de mémoire physique. Les gens qui ont besoin de cette constante se reconnaitront. |
Si create_area() réussie, l'area_id de la nouvelle area est retourné. Sinon, elle retourne un des codes d'erreur suivant :
CODES DE RETOUR
Voir aussi : clone_area()
|
Supprime l'area désignée. Si aucune autre area pointe sur la mémoire physique que cette area représente, la mémoire est libérée. Après la suppression, la valeur de area n'est plus un identifiant d'area valide.
|
CODES DE RETOUR
|
Retourne une area dont le nom correspond avec l'argument. Les noms d'area n'ont pas besoin d'être uniques—des appels successifs à cette fonction avec le même argument peut très bien ne pas retourner le même area_id.
Ce que vous faites avec l'area trouvée dépend d'où elle vient :
CODES DE RETOUR
Voir aussi : area_for()
|
Copient des informations sur une area particulière dans la structure area_info désignée par info. La première version de ces fonctions indique l'area directement, par son area_id.
La version get_next_area_info(), elle, vous permet de parcourir la liste de toutes les areas d'une team, par appel successifs. L'argument team identifie la team que vous voulez observer; une valeur 0 de team signifie la team du thread appelant. L'argument cookie est un marqueur, positionnez-le à 0 lors du premier appel, la fonction s'occupe du reste. Celle-ci retourne B_BAD_VALUE lorsqu'il n'y a plus d'areas à visiter :
/* Obtenir l'area_info pour chaque area de cette team. */ area_info info; int32 cookie = 0; while (get_next_area_info(0, &cookie, &info) == B_OK) ...
La structure area_info est :
|
Les champs sont :
Les quatres derniers champs fournissent des informations sur l'area qui peuvent étre utiles pour diagnostiquer l'utilisation du système. Les champs sont particulièrement précieux si vous chasser des pertes mémoire :
CODES DE RETOUR
|
Modifie la taille de l'area désignée à new_size, exprimé en octets. L'argument new_size doit être un multiple de B_PAGE_SIZE (4096).
Les modifications de taille affecte la fin de la mémoire allouée existante de l'area : si vous augmentez la taille de l'area, la nouvelle mémoire est ajouté à la fin de l'area; si vous réduisez l'area, les pages en fin sont relâchées et libérées. En aucun cas l'adresse de début de l'area ne change, ni les données existantes dedans ne sont modifiées (excepté, bien sûr, pour les données perdues en raison d'une diminution).
Redimenssionner affecte toutes les areas qui réfèrent la mémoire physique de cette area. Par exemple, si B est un clone de A, et vous Redimenssionner A, B sera automatiquement redimenssionnée (si c'est possible).
CODES DE RETOUR
|
Modifie les droits de lecture/écriture de l'area donnée. L'argument new_protection est un masque binaire indiquant l'une, l'autre ou les deux constantes B_READ_AREA et B_WRITE_AREA. La première signifie que l'area peut être lue; la seconde, qu'elle peut être modifiée. La protection d'une area ne s'applique uniquement aux accès à la mémoire sous-jacente par cette area spécifique. Des areas clones différentes se réfèrant à la même mémoire peuvent avoir des protections différentes.
CODES DE RETOUR
Table des matières du Be Book | Index du kit du Noyau |