YeXo - een kernel programmeren

09 mei 2006

Een malloc-functie

Ik ben nu bezig om mijn eigen malloc-functie (malloc is een afkorting voor memory allocator) te schrijven voor mijn kernel. Deze functie noem ik kalloc. Een goed voorbeeld is Doug Lea's malloc. Zie ook de broncode van dlmalloc. Mijn eigen allocator wordt veel simpeler. Ik hou een linked list bij van blokken geheugen die of vrij of in gebruik zijn. Bij deze blokken sla ik de lengte, het type (vrij of in gebruik) en een pointer naar het volgende blok op. Als kalloc wordt aangeroepen wordt de linked list doorlopen vanaf het eerste vrij blok (daarnaartoe hou ik een globale variabele bij) tot het blok dat genoeg ruimte heeft. Als dit blok veel te groot is wordt het in twee blokken gesplitst. Zodra een blok vrijgemaakt wordt via de functie free, wordt gekeken of het blok erachter ook vrij is, zoja, dan worden deze twee blokken samengevoegd. Eventueel laat ik kalloc ook nog controlen of er twee blokken achter elkaar vrij zijn, zodat ook aanvragen voor grotere stukken afgehandeld kunnen worden door twee vrij aanliggende stukken aan elkaar te plakken.


Ik zet voor elk stuk geheugen dat ik vrijgeef de volgende header:struct blockInfoStruct{
unsigned long length;
struct blockInfoStruct *next;
unsigned short type;
unsigned short reserved;
} __attribute__((packed));

4 Reacties:

  • Hallo YeXo,

    Aangezien (k)free kijkt of het blok erachter ook vrij is en ze samenvoegt, kan het als alles goed is nooit voorkomen dat kalloc twee vrije blokken achter elkaar vind.

    Of zit er een diepere gedachte achter?

    Succes met je OS,
    Kasper

    Door Anonymous Anoniem, op 07 februari, 2008 17:01  

  • Stel dat de volgende situatie voorkomt:
    -vrij blok (1)-
    -bezet blok (2)-
    -vrij blok (3)-

    Als nu free aangeroepen wordt op blok 2, dan wordt blok 2 samengevoegt met blok 3, en krijg je dit:
    -vrij blok (1)-
    -vrij blok (2+3)-

    Zoals je ziet zijn er nu toch twee vrije blokken achter elkaar ontstaan.

    Door Blogger Yexo, op 08 februari, 2008 09:34  

  • Hallo YaXo,

    Klopt, ik weet niet of ik aan dat voorbeeld gedacht had.

    Stel dat je de header veranderd in:
    struct blockInfoStruct{
    unsigned long length;
    struct blockInfoStruct *prev;
    struct blockInfoStruct *next;
    unsigned short type;
    unsigned short reserved;
    } __attribute__((packed));

    En bij de functie free ook kijkt of het block ervoor vrij is. Maar het zou goed kunnen dat beide methoden niet zoveel van elkaar verschillen.

    Kasper

    Door Anonymous Anoniem, op 16 februari, 2008 16:16  

  • Dat is ook een prima oplossing. Het nadeel daarvan is dat die weer iets meer geheugen gebruikt, hoewel niet zoveel, kan het behoorlijk oplopen als je veel kleine stukjes geheugen nodig hebt.

    Door Blogger Yexo, op 17 februari, 2008 17:02  

Een reactie posten

<< Home