Stronicowanie Plików
Do spisu treści tematu 4
4.4 Stronicowane plików
Spis treści
Wprowadzenie
Struktury wykorzystywane przez stronicowanie plików
do_munmap()
generic_filemap()
Operacje na stronach
filemap_nopage()
filemap_swapout()
filemap_swapin()
Funkcja swapująca: shrink_mmap()
Bibliografia
Wprowadzenie
Stronicowanie plików jest mechanizmem pozwalającym przypisać ciąg danych,
zawarty w pliku, pewnym stronom pamięci wirtualnej procesu, najcześciej
stanowiącym jej spójny obszar. Istotną cechą systemu zarządzania pamięcią w
Linuxie, która w zasadzie stanowi o efektywności mechanizmu stronicowania
(mapowania) jest ta, iż strona obecna w pamieci wirtualnej, tak na prawdę
nie musi znajdować się w pamięci operacyjnej a może być do niej przywołana,
gdy zajdzie potrzeba operacji na danych. Z tego powodu w strukturach pamięci
wirtualnej muszą znajdować się informacje pozwalające szybko odnaleźć
potrzebny fragment odpowiadającego danej stronie pliku na właściwym
urządzeniu zewnętrznym.
next_hash page->prev_hash) .W strukturze tej, są umieszczone
obecne w pamięci strony mapowanych plików, co pozwala uniknać wczytywania
tych samych danych przez kilka procesów .
Funkcje obsługi stronicowania
Opis funkcji do_mmap(..)
do_mmap jest funkcją służącą o tworzenia nowych obszarów pamięci wirtualnej,
pozwalającą jednocześnie na stronicowanie plików.
unsigned long do_mmap(struct file *file, unsigned long addr, unsigned long len,
unsigned long prot, unsigned long flags, unsigned logn off)
Znaczenie parametrów wywołania:
- file : wskaźnik do struktury file pliku, który chcemy mapować. Wartoscią
tego parametru może być NULL, w tym wypadku przydzielona pamięć
wirtualna nie będzie związana z żadnym plikiem. Naturalną
konsekwencją są wtedy wartości vm_ops ==NULL, inode==NULL
a wartość offset staje się nieistotna. Ograniczeniem przy
wywołaniu funkcji z parametrem NULL, jest konieczność ustawienia
flagi MAP_PRIVATE. Przy fladze MAP_SHARED zostanie zwrócony błąd
niewłaściwego argumentu.
addr : życzenie co do poczatku mapowanego obszaru pamięci wirtualnej
len : dłlugość mapowanego obszaru
prot : flagi związane z prawami do czytania, zapisu i wykonywania na
stronach należących do przydzielanego obszaru
flags: przekazywane tym parametrem flagi decydują o wlaściwościach
stronicowania:
MAP_SHARED i MAP_PRIVATE : sa to wykluczające się flagi
określające, czy zmiany na stronach mają charakter prywatny, czy
też są dzielone. W tym drugim wypadku, obsługa stron jest bardziej
złożona, co wymusza przypisanie większej ilości funkcji do
struktury vm_ops. Warto zauważyć, iż obszar z ustawioną flagą
VM_SHARED, jednocześnie przypisany do pliku do którego nie ma praw
zapisu nie wymaga złożonych operacji na pamięci dzielonej. W tym
wypadku ustawiana jest flaga VM_PRIVATE .
MAP_FIXED : ustawienie tej flagi oznacza iż funkcja musi
przydzielić dokładnie obszar pamięci wirtualnej zaczynający się od
"addr", a poprzednie stronicowania na nim zostaną usunięte.
Oczywiście addr musi być wtedy wielokrotnoscią strony - warunek
ten jest sprawdzany i gdy nie jest spełniony powoduje zwrócenie
blędu "-EINVAL" (niewłasciwy argument).Gdy flaga nie jest
ustawiona a podany obszar jest zajety, wywoływana funkcja
get_unmapped_area() przegląda listę zajętych obszarów w poszukiwaniu
fragmentu wolnej pamięci większej lub równej od wyznaczonej, po
czym właśnie tam dokonuje się mapowania.
off : offset, określający początek stronicowanego obszaru pliku.Wartość
ta nie musi być wielokrotnoscią rozmiaru strony.
Działanie funkcji do_mmap():
Funkcja wpierw sprawdza poprawność przekazanych argumentów, następnie
wybiera właściwy obszar pamięci wirtualnej (patrz : flaga MAP_FIXED ).
Dalej, rezerwuje pamięć dla kolejnej struktury vm_area_struct i
wypełnia jej pola:
vm_start, vm_end : początek i koniec obszaru pamięci;
vm_flags : flagi ustawiane na podstawie informacji w prot , flags,
mm->def_flags a także flag pliku ( o ile przekazano plik );
vm_page_prot : ustawia flagi ochrony stron na podstawie ostatnich 4
bitów zmiennej vm_flags
vm_offset : przekazany offset w pliku
pozostałe pola są zerowane.
Później, o ile dokonywane jest mapowanie pliku, wywoływana jest
właściwa dla danego systemu plików funkcja file->f_op->mmap() która
kończy wypełnianie pól struktury vm_area_struct o wartości
charakterystyczne dla stronicowania pliku, w szczególności przypisuje
wartość vm_inode i własciwe operacje ( *vm_ops ).
Dalej pozostaje już tylko umieścić nowo powstalą strukturę na liście i
drzewie AVL w danych procesu, sprawdzić czy przyłączony obszar nie styka
się z innym odnoszącym się do tego samego pliku (można je wtedy połączyć w
jedną strukturę ) i uaktualnić pola procesu:
mm->total_mm : (całkowita ilość przydzielonej pamięci)
mm->locked_vm : (całkowita ilość zablokowanej pamięci o ile ustawiona
jest flaga VM_LOCKED : def_flags ).
Jeżeli z stronicowanym plikiem są związane jeszcze inne mapowania (jest
dowiązanie do vm_inode->i_mmap), to przy dołączaniu obszaru do struktur
procesu, jest on dodatkowo umieszczany na liście i_mmap a także pola
vm_next_share i vm_prev_share sa ustawiane na elementy tej listy. (nazwa
vm_prev/next_share jest trochę myląca: także strony z flagą VM_PRIVATE są
umieszczane na tej liście o ile wskazują na ten sam fragment pliku).
opis funkcji file->f_op->mmap() :
Funkcja ta wywoływana jest wewnątrz funkcji do_mmap() i ma za zadanie
wykonać akcje charakterystyczne dla danego systemu plików, przy
stronicowaniu.W większości systemów plików do wskaźnika na mmap() przypisana
jest funkcja generic_file_mmap(). Do nielicznych wyjątkow należą np. FAT ,
NCPFS , system NFS natomiast, wywołuje generic_file_mmap() wewnątrz
własnej funkcji przypisanej na mmap().
opis funkcji generic_file_mmap()
int generic_file_mmap(struct inode * inode, struct file *file,
struct vm_area_struct *vma)
opis parametrów wywołania :
inode : wskaźnik na odpowiednią strukturę inode
file : wskaźnik na strukturę stronicowanego pliku
vma : struktura vm_area_struct do której mapujemy, jest ona częściowo
wypełniona co pozwala przekazać dodatkowe parametry.
opis działania funkcji:
Jeżeli w vm->vm_flags ustawiona jest flaga VM_SHARED oraz mozliwość zapisu,
za operacje w vm_ops przypisywane są operacje charakterystyczne dla pamięci
dzielonej (Dodatkowym warunkiem jest, aby przesunięcie w pliku było
wielokrotnością rozmiaru strony) w przeciwnym wypadku funkcja przypisuje
operacje odnoszace sie do pamięci prywatnej. Następnie sprawdzana jest
poprawność elementóow struktury inode, zwiekszany licznik
inode->i_count zliczający obszary mapujace odpowiadający i-węzłowi plik a
vma->vm_inode przypisywana jest wartość i-węzła .
Wyszukiwarka
Podobne podstrony:
Opis(13)Hiren s BootCD 13 2 (Rebuild 20 04 2011) opisW 13 Microstation 5 0 opisSektor 13 opis mapyAttiny 13 opisNEXUS Nowe Czasy nr 13 2000 5 opisOpis zawodu AnkieterUAS 13 zaoer4p2 5 13Opiswięcej podobnych podstron