Zadanie laboratoryjne

WSTĘP
Podczas stronicowania plików, zachodzi konieczność określenia, w którym fragmencie pamięci wirtualnej zostanie przydzielona pamięć dla nowego fragmentu pliku. Istnieje możliwość wymuszenia określonego obszaru za pomocą odpowiedniej flagi , ale gdy flaga ta nie jest ustawiona a wskazany obszar jest zajęty, proces wywołuje funkcję get_unmapped_area() która znajduje koniec ostatniej struktury vm_area_struct, bądź lukę między dwoma strukturami: gdy znajdzie lukę, umieszcza nowo przydzielaną pamięć na początku owej luki. po zakończeniu stronicowania wywoływana jest funkcja merge_segments() która na zadanym obszarze sprawdza, czy parametry sąsiadujących obszarów pozwolą połączyć je w jedną strukturę.

ZADANIE
Zastąpić funkcję : unsigned long get_unmapped_area( unsigned long addr, unsigned long len) podobną funkcją get_better_unmapped_area() , która wybierając obszar do mapowania będzie się kierować dodatkowymi kryteriami: gdy tradycyjnie znaleziony wolny obszar będzie leżał pomiędzy dwoma strukturami vm_area_struct i będzie większy od wymaganego, funkcja ma sprawdzić , czy parametry wymagane do późniejszego połączenia obszarów nie decydują o tym z której strony wolnej pamięci należy umieścić stronicowany obszar, a także, gdy obszar przyległy, o wyższych adresach ma odpowiednie parametry rozważyć możliwość porzyłączenia pamięci za tym obszarem ( musi tam być dostatecznie dużo wolnego miejsca, ale być może zostanie mniej wolnego obszaru : tu mapujemy na zasadzie najlepiej pasującego).
UWAGI
- funkcja get_unmapped_area() jest wywoływana w kilku miejscach, więć raczej należy stworzyć nową funkcję)
- gdy obszarom jest przypisany fragment pliku, ważne jest aby po złączeniu nadal był to obszar spójny, tak więc ma znaczenie fakt z której strony przyłączamy i czy między częściami pliku nie będzie "dziury"
- warunki na parametry , wymagane aby obszary można było złączyć, należy wziąć z funkcji merge_segments()
- wszystkie opisane funkcje znajdują sie w pliku linux/mm/mmap.c
- ze względu na wykorzystywane w nowej funkcji parametry, należy przebudować funkcję do_mmap(). Nie warto jednak przed wybraniem obszaru wykonywać f_op->mmap(). Tym samym nie można porównać funkcji vm_ops. Nie stanowi to dużej zmiany, gdyż zgodność spójności plików jest wystarczająco silnym warunkiem a funkcja będzie działać głównie dla obszarów nie podłączonych do plików.



Piotr Kozlowski