Changes between Version 69 and Version 70 of AS6-TME-B6


Ignore:
Timestamp:
Mar 24, 2025, 1:14:37 PM (2 months ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B6

    v69 v70  
    266266'''
    267267}}}
    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 nepasdemander 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).
     2681. 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é.
    273273'''
    274274}}}
     
    479479
    480480{{{#!c
    481 void kfree (void * obj, size_t size)
     481void kfree (void * obj)
    482482{
    483     size_t nbline= NBLINE(size) % MaxLinePage;              // which slab to use
    484483    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
    487487        "\ncan't free object not allocated by kmalloc()");  // write a message then panic
    488488
    489     list_addfirst (&Slab[nbline], (list_t *)obj);           // add it to the right free list
    490     Objects[nbline]--;                                      // decr the number of obj of size nbline
    491     if (size == 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;
    492492    if (--Page[npage].alloc==0) {                           // splitted page and no more object left
    493493        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 list
     494        list_foreach (&Slab[slab], item) {                  // browse all item in free list
    495495            size_t np_item = (size_t)((char*)item-kmb)>>12; // page number Page[] table
    496496            if (np_item == npage) {                         // if current item is in the page
     
    500500        Page[npage].slab = 0;                               // since the page is empty, thus slab 0
    501501        list_addfirst (&Slab[0], (list_t *)page);           // add the free page in slab[O]
    502         Objects[0]--;                                       // decr the number of pages used
     502        ObjectsThisSize[0]--;                               // decr the number of pages used
    503503    }
    504504}
    505505}}}
    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