Changes between Version 69 and Version 70 of AS6-TME-B6
- Timestamp:
- Mar 24, 2025, 1:14:37 PM (2 months ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AS6-TME-B6
v69 v70 266 266 ''' 267 267 }}} 268 1. Pour libérer un objet alloué par l'allocateur d'objets du noyau, on utilise la fonction `kfree()` qui prend en argument le pointeur alloué par `kmalloc()`. Pourquoi ne pasdemander la taille ? Est-ce une contrainte ?269 {{{#!protected ------------------------------------------------------------------ 270 ''' 271 * `kfree()` demande la taille pour savoir dans quelle liste d'objets libre remettre l'objet.272 * Le `kfree()` de Linux ne le demande pas, mais je ne pense pas que cela soit une contrainte. On est dans le noyau et je ne pense pas que le noyau ait à libérer des objets dont il ignore le type et donc la taille. Par contre cette information donnée à `kfree()` permet de ne pas avoir besoin de la stocker quelque part lors de l'allocation (comme c'est fait pour l'allocateur de la libc).268 1. Pour libérer un objet alloué par l'allocateur d'objets du noyau, on utilise la fonction `kfree()` qui prend en argument le pointeur alloué par `kmalloc()`. Pourquoi ne pas demander la taille ? 269 {{{#!protected ------------------------------------------------------------------ 270 ''' 271 * `kfree()` ne demande pas la taille pour savoir dans quelle liste d'objets libre remettre l'objet parce qu'il peut la connaitre en sachant dans quelle page (et donc quel slab) se trouve l'objet grâce à la table Page[]. 272 * Une fois qu'il connaît le slab, il sait dans quelle liste ajouter l'objet libéré. 273 273 ''' 274 274 }}} … … 479 479 480 480 {{{#!c 481 void kfree (void * obj , size_t size)481 void kfree (void * obj) 482 482 { 483 size_t nbline= NBLINE(size) % MaxLinePage; // which slab to use484 483 size_t npage = (size_t)(obj - (void *)kmb)>>12; // relative page number from kmb 485 486 PANIC_IF ((nbline>255)||(npage >= NbPages), // too big or outside of the region 484 size_t slab = Page[npage].slab; // which slab to use 485 486 PANIC_IF((npage >= NbPages), // outside of the page region 487 487 "\ncan't free object not allocated by kmalloc()"); // write a message then panic 488 488 489 list_addfirst (&Slab[ nbline], (list_t *)obj);// add it to the right free list490 Objects [nbline]--; // decr the number of obj of size nbline491 if (s ize == PAGE_SIZE) return;489 list_addfirst (&Slab[slab], (list_t *)obj); // add it to the right free list 490 ObjectsThisSize[slab]--; // decr the number of obj of size slab 491 if (slab == 0) return; 492 492 if (--Page[npage].alloc==0) { // splitted page and no more object left 493 493 list_t *page = (list_t *)((size_t)obj & ~0xFFF); // address of the page containing obj 494 list_foreach (&Slab[ nbline], item) {// browse all item in free list494 list_foreach (&Slab[slab], item) { // browse all item in free list 495 495 size_t np_item = (size_t)((char*)item-kmb)>>12; // page number Page[] table 496 496 if (np_item == npage) { // if current item is in the page … … 500 500 Page[npage].slab = 0; // since the page is empty, thus slab 0 501 501 list_addfirst (&Slab[0], (list_t *)page); // add the free page in slab[O] 502 Objects [0]--;// decr the number of pages used502 ObjectsThisSize[0]--; // decr the number of pages used 503 503 } 504 504 } 505 505 }}} 506 **Explication de l'usage du tableau `Page`** :\\Le tableau `Page[]` est un tableau de structures dont chaque case contient l'usage de la page : pour quel slab la page est utilisée et combien d'objets y sont alloués. Lors de la libération d'un objet du noyau par `kfree()`, l'allocateur remet l'objet dans la liste des objets libres de sa taille (le tableau de listes `Slab[]`) et il décrémente le compteur d'objets présents dans la page `--Page[npage].alloc` (`npage` identifie la page).Si la page ne contient plus d'objet alloué alors `kfree()` recherche les objets libres de même taille qui sont dans la page `npage` alors il les retire. Ensuite la page est libérée.\\Vous n'avez pas à changer ce fonctionnement, ce qu'il faut c'est ne pas l'invoquer si le nombre d'objet libre est en dessous d'un seuil.507 508 506 **Explication de l'usage du tableau `Page`** :\\Le tableau `Page[]` est un tableau de structures dont chaque case contient l'usage de la page :\\ - pour quel slab la page est utilisée\\ - et combien d'objets y sont alloués.\\Lors de la libération d'un objet du noyau par `kfree()`, l'allocateur remet l'objet dans la liste des objets libres de sa taille (le tableau de listes `Slab[]`) et il décrémente le compteur d'objets présents dans la page `--Page[npage].alloc` (`npage` identifie la page).\\Si la page ne contient plus d'objet alloué alors `kfree()` recherche les objets libres de même taille qui sont dans la page `npage` alors il les retire. Ensuite la page est libérée.\\Vous n'avez pas à changer ce fonctionnement, ce qu'il faut c'est ne pas l'invoquer si le nombre d'objet libre est en dessous d'un seuil. 507 508