[ Pobierz całość w formacie PDF ]
.Bit ten jest zapalany za kazdym razem kiedy systemodwoluje sie do tej ramki poprzez kolejke haszujaca (funkcje: add_page_to_hash_queueoraz find_page plik: pagemap.h).Bit ten jest sprawdzany jek rowniez modyfikowanyw funkcji shrink_mmap (plik: mm/filemap.c) ktora odpowiedzialna jest zawybor ramki do zwolnienia.Jesli ramka ma zapalony bit PG_referenced jeston zerowany, a ramka nie jest odsylana do swapa.Zerowy bit PG_referencedjest jednym z warunkow odeslania do swapa.bit PG_uptodateBit ten mowi czy zawartosc ramki jest aktualna.Kiedy konczy sie operacja zapisu do ramki ustawia sie ten bit (lub nieustawia w przypadku wystapienia bledu podczas operacji czytania).bitPG_free_afterJesli operacja zapisu I/O zakonczy sie i bit PG_free_afterjest rowny 1 to strona zostaje natychmiast zwolniona.bitPG_decr_afterLinux posiada mechanizm synchronicznej i asynchronicznejwymiany ramek.Oznacza to ze w tej samej chwili kilka ramek moze jednoczesniepodlegac wymianie (byc zapisywane na urzadzenie wymiany oraz byc z niegosprowadzane).Jesli operacja I/O na ramce jest wykonywana synchronicznie(czyli nie czekamy na koniec operacji) to bit ten jest ustawiany na 1,a licznik wszystkich synchronicznych operacji I/O (nr_async_pages)jest zwiekszany o jeden.Zawsze po zakonczeniu operacji I/O jesli bit PG_decr_afterjest rowny jeden to zmniejszany jest licznik nr_async_pages.patrz: funkcja brw_pagebitPG_swap_unlock_afterTen bit jest ustawiany tylko funkcji rw_swap_page(.)(plik: mm/page_io.c) w przpadku kiedy nie chcemy czekac az skonczy sieoperacje I/O na ramce.W tym przypadku sa tez zapalane bity PG_free_afteri PG_decr_after oraz zwiekszana jest o jeden ilosc synchronicznych operacjiI/O na ramkach: atomic_inc(&nr_async_pages).Natomiat bit ten jest testowany (i zarazem zerowany)tylko w funkcji after_unlock_page(.)- plik: fs/buffer.c.Funkcja ta jest wywolywana w momencie zakonczeniaoperacji I/O.bit PG_DMABit ten jest ustawiny dla ramek ktore leza w zasiegu mechanizmu transferukanalami DMA.Zasieg ten jest scisle uzalezniny od architektury.Podczas startu systemy (funkcja: free_area_init plik: mm/page_all.c)bit ten jest ustawiany dla kazdej ramki.Dopiero po tym ( w funkcji mem_initplik: arch/*/mm/init.c ) jesli ramka lezy poza adresem MAX_DMA_ADDRESSbit ten jest zerowany.Na przyklad dla i386 wartosc ta wynosi:/* The maximum address that we can perform a DMA transfer to on this platform */#define MAX_DMA_ADDRESS 0x1000000bit PG_reservedFlaga ta oznacza ze do tej ramki nie moze byczadnych odwolan (strona ta moze wogole nie istniec).Uzywanie tej flagijest w duzym stopniu uzaleznione od architektory procesora.Podczas startusystemu ( start_kernel -> paging_init -> free_area_init ) flaga tajest ustawiana dla kazdej ramki (nie zaleznie od architektury - plik: mm/page_all.c).structpage - pole buffersRamka moze posiadac zaalokowane na sobie bufory.Jesli tak jest to page->buffersjest cykliczna lista tych buforow, jesli tak nie jest to page->buffers==NULL.struct page- pole ageTo pole bitowe przechwuje informacje dotyczace wieku ramki.W Linuxiestosuje sie liniowe postarzanie (funkcja age_pagepostarza strone a funkcja touch_pageodmladza.Im strona ma mniejsze age tym jest starsza !.MAX_PAGE_AGE,PAGE_ADVANCE i PAGE_DECLINE sa stalymi.Wartosc tych stalych ma kluczoweznaczenie dla dzialania algorytmow decydujacych o wyborze ramki ktora nalezyodeslac do swapa.Zmiana wartosci tych stalych doprowadzi do calkiem innegozachowania systemu.static inline void touch_page(struct page *page){if (page->age < (MAX_PAGE_AGE - PAGE_ADVANCE))page->age += PAGE_ADVANCE;elsepage->age = MAX_PAGE_AGE;}static inline void age_page(struct page *page){if (page->age > PAGE_DECLINE)page->age -= PAGE_DECLINE;elsepage->age = 0;}Funkcja:brw_page (plik: fs/buffer.c)Funkcja ta wykonuje operacje I/O pomiedzy pamiecia (ramkami) a urzadzeniemwymiany.argumenty (niektore):numer ramkiilosc danych do przeniesieniaurzadzenie wymianyczy nalezy czekac na zakonczeniebrw_page od wczesniejszych funkcji oczekuje ze strona ta jest juz zablokowana(czyli zapalony bit PG_locked).Funkcjata moze sie zakonczyc jeszcze przed zakonczeniem operacji I/O (synchronicznawymiana stron).Krotki opis funkcji :funkcja mimo wszystko sprawdza czy ramka jest zablokowana (zapalonybit bit PG_locked)zeruje ramce bity: PG_uptodateoraz PG_errorwywoluje operacje I/Onastepuje powrot z funkcji bez wzgledu na to czy operacja I/O zdarzylasie zakonczy czy tez nie (przypadek bez czekania )Po zakonczeniu operacji I/O :ramce zerowany jest bit: PG_lockeda ustawiany PG_uptodatebudzi sie procesy czekajace na zakonczenie operacji ( wake_up(&page->wait))jesli jest ustawiony bit PG_decr_afterzostaje on wyzerowany oraz ilosc stron podlegajacej synchronicznej wymianiezostaje zmniejszona o jedenjesli jest ustawiony bit PG_free_afterzostaje on wyzerowany a ramka zostaje zwolnina (jesli page->count==0)jesli jest ustawiony bit PG_swap_unlock_entryzostaje on wyzerowanyfunkcja:after_unlock_pagestatic inline void after_unlock_page (struct page * page){if (clear_bit(PG_decr_after, &page->flags))atomic_dec(&nr_async_pages);if (clear_bit(PG_free_after, &page->flags))free_page(page_address(page));if (clear_bit(PG_swap_unlock_after, &page->flags))swap_after_unlock_page(page->swap_unlock_entry);}Funkcja jest uruchamiana po zakonczeniu kazdej operacji I/O.Jako parametrotrzymuje wskaznik do odpowieniego miejsca w tablicy ramek mem_map.Jeslibyl ustawiony bit PG_decr_after zmniejsza licznik synchronicznych operacjiI/O na ramkach.Jesli byl ustawiony bit PG_free_after ramka zostaje natychmiastzwolniona.Pare uwag do stronyWiekszosc funkcji zarzadzajacymi ramkami silnie korzysta ze sprzetowejakceleracji zaleznej od uzytego procesora (procesorow).Pociaga to za sobafakt ze wiele z nich, w zaleznosci od architektory, znacznie sie od siebierozni.Ze wzgledu na to ze jadro 2.0 Linuxa przewidziane jest na kilkaplatform, trudno bylo mi analizowac zachowanie pewnych funkcji dla kazdejz platform.Tak wiec w opisie funkcji systemowych scisle zwiazanych z rodzajemprocesora ograniczalem sie do i386.Na tej stronie staralem sie zaznaczacktora funkcja jest zalezna od sprzetu, a ktora nie.Przepraszam jesli gdzieszapomnialem dodac ta uwage.Przy niektorych funkcjach dopisywalem plikzrodlowy w ktorym dana funkcja sie znajduje.Z polozenia tego pliku rowniezlatwo domyslic sie czy funkcja jest zalezna od platformy czy tez nie.Bibliografiapliki z katalogu: mm (wiekszosc)include/linux/mm.harch/i386/mm/init.cinclude/asm-i386/page.h, pgtable.hautor: Adam Wozniak
[ Pobierz całość w formacie PDF ]