Changes between Version 50 and Version 51 of AS6-TME-B6


Ignore:
Timestamp:
Mar 30, 2022, 8:19:48 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B6

    v50 v51  
    314314On voit que les blocs sont parcouru depuis `Heap.beg` le premier bloc jusqu'au dernier `Heap.end` (qui n'est pas vraiment un bloc mais une frontière). Lisez le code et trouvez comment recommencer le prochain `try_malloc()` à partir de dernier bloc alloué. Ce n'est pas difficile, mais il faut comprendre...
    315315
     316**ulib/memory.c**
    316317{{{#!c
    317318static size_t CacheLineSize;    // cache line size set by malloc_init()
     
    328329} Heap;
    329330
     331// C Macros to align a pointer p to the current cache line address or the next one
     332// For example, let the CacheLineSize is 0x10 Bytes (4 int), then
     333// if p = 0x76543214 then LINE_FLOOR(p) = 0x76543210 and LINE_CEIL(p) = 0x76543220
     334
    330335#define LINE_FLOOR(p)   (block_info_t *)FLOOR((size_t)(p),CacheLineSize)
    331336#define LINE_CEIL(p)    (block_info_t *)CEIL((size_t)(p),CacheLineSize)
     
    351356        new->size = newnext - new;                          // new size of current block
    352357        new->magic = MAGIC_HEAP;                            // to try detect Heap corruption
    353         newnext->size = oldnext - newnext;                  // new size of remainning space
     358        newnext->size = oldnext - newnext;                  // new size of remaining space
    354359        newnext->full = 0;                                  // that is free space
    355360        newnext->magic = MAGIC_HEAP;                        // to try detect Heap corruption
     
    372377== B.2. Transformer l'allocateur first-fit en allocateur best-fit
    373378
    374 Plus difficile, passer l'allocateur en best-fit. Je ne vous demande pas d'écrire le code, sauf si vous avez du temps et de la motivation. En revanche, vous pouvez réfléchir à la manière de procéder. Pour vous aidez, l'idée, c'est de ne pas toucher aux chaînages des blocs utilisés par first-fit. Il faut créer un chaînage ordonné par taille des blocs libres en utilisant l'API `list`.
    375 
    376 == B.3. Tester que les piles n'ont pas débordées
    377 
    378 
     379
     380Plus difficile, passer l'allocateur en best-fit. Je ne vous demande pas d'écrire le code, sauf si vous avez le temps et la motivation. En revanche, vous pouvez réfléchir à la manière de procéder. Pour vous aidez, l'idée, c'est de ne pas toucher aux chaînages des blocs utilisés par first-fit. Il faut créer un chaînage ordonné par taille des blocs libres en utilisant l'API `list` et l'utiliser pour trouver le bloc de la bonne taille. Ce n'est très difficile mais il y a pleins de détails à régler, par exemple, décider de ce que l'on lors d'un ''merge'' des blocs libres.
     381
     382
     383== B.3. Tester que les piles n'ont pas débordé
     384
     385
     386Vous savez peut-être que dans un processeur disposant d'un mécanisme permettant à chaque application d'avoir son propre espace d'adressage (espace d'adressage virtuel), les accès à la mémoire passe par un composant de traduction d'adresses nommé **MMU** pour traduire les adresses virtuelles de l'application en adresses physiques de l'espace d'adressage physique où se trouvent les segments de mémoire physique (gérés par les bancs de mémoire).
     387
     388L'un des rôles de ce composant **MMU** (Memory Management Unit) est de tester la légalité des accès à la mémoire. Si le noyau attribut un segment d'adresses à une application. Si l'application tente d'accéder en dehors de ce segment, la MMU le détecte et prévient le noyau par une exception. C'est l'erreur ''Segmentation Fault'' que vous avez certainement déjà eu.
     389
     390Le SoC **almo1** n'a pas de MMU, donc pas de gestion de mémoire virtuelle, or nous voulons tester que les segments d'adresses définis pour les deux piles de threads ne débordent pas. Pour ce faire, les deux piles de threads (user et kernel) ont des nombres magiques (`MAGIC_STACK`) dans leur premier et dernier mot. Ces mots ne devraient jamais être écrasés, si cela se produit, c'est que les piles ont été corrompues ou qu'elles ont débordé.
     391
     392L'idée est de tester à intervalle régulier que les nombres magiques sont toujours présents, par exemple lors des changements de threads. C'est un bon moment parce qu'on peut tester que les piles du thread sortant n'ont pas débordé pendant son exécution et que les piles du thread entrant sont correctes avant de lui donner un cœur.
    379393
    380394