====== Uživatelský paměťový alokátor pro OS NOVA ====== Na tomto cvičení si zkusíte implementovat alokátor dynamické paměti, který bude využívat systémové volání brk z minulého cvičení. ===== Domácí příprava ===== Pro toto cvičení budete potřebovat: * hotovou minulou úlohu * vědět co je alokátor dynamické paměti (memory allocator) a způsoby implementace * https://cw.fel.cvut.cz/wiki/_media/courses/b4b35osy/lekce07.pdf * http://arjunsreedharan.org/post/148675821737/write-a-simple-memory-allocator * spojové seznamy * https://en.wikipedia.org/wiki/Linked_list * rozumět programování v C/C++ * připustit existenci volání malloc a free * https://linux.die.net/man/3/malloc ===== Zadání úlohy ===== Implementujte jednoduchý alokátor paměti pro uživatelský prostor OS NOVA. Váš alokátor bude nabízet implementovat funkce my_malloc a my_free s následujícími prototypy: void *my_malloc(unsigned int size) int my_free(void *address) Pro získání 4 bodů budou od alokátoru budou očekávány následující vlastnosti: * Alokátor bude možné používat po přilinkování k aplikaci ''usr/hello.c'' ze zdrojových kódů OS NOVA. * //my_malloc// alokuje paměť velikosti //size// a vrací adresu začátku alokované paměti. Pokud paměť požadované velikosti nelze alokovat, //my_malloc// vrací 0. * //my_free// uvolní paměť alokovanou funkcí //my_malloc//. Parametr //address// je hodnota dříve vrácená funkcí //my_malloc//. Pokud je paměť úspěšně uvolněna, funkce vrátí 0, v opačném případě je vrácen nenulový kód chyby, který si můžete nadefinovat jak chcete. * Pokud je //my_free// zavolána na již uvolněnou paměť nebo na paměť, která nebyla alokována voláním //my_malloc//, je to považováno za chybu. Můžete předpokládat, že program používající váš alokátor nemodifikuje jinou paměť na heapu než tu, vrácenou funkcí //my_malloc//. * Bude schopná alokovat a uvolnit paměť. * Bude používat systémové volání //brk// pro získání paměti pro alokaci. * Pokud bude uživatel alokovat paměť po 16B. blocích (a větších), bude mít k dispozici alespoň 50% paměti, kterou je možné získat pomocí volání //brk//. * Dealokovaná paměť půjde alokovat znovu. * Paměť alokovaná funkcí //my_malloc// bude přístupná minimálně do doby zavolání //my_free//. * Žádná část paměti alokované funkcí //my_malloc// nebude alokovaná znovu dříve než bude zavoláno odpovídající //my_free//. Pro získání 8 bodů budou navíc vyžadovány následující vlastnosti: * Po uvolnění menších sousedních bloků bude možné ve stejné oblasti alokovat jeden velký souvislý blok. **Co se odevzdává**:\\ Archiv obsahující vaši implementaci v souboru ''user/mem_alloc.cc'' a soubor ''kern/src/ec_syscall'' z minulého cvičení. Můžete ho vytvořit pomocí následující řádky z kořenového adresaře NOVY (nebo si můžete upravit pravidlo hw11 v Makefilu): zip hw11.zip kern/src/ec_syscall.cc user/mem_alloc.cc