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