Do spisu tresci tematu 4

4.3.3 Bledy braku i ochrony strony





Spis tresci


Wprowadzenie

Obsluga bledow stron wespol z mechanizmami wymiany stron (ang. swap out - przepisanie do urzadzenia wymiany; swap in - pobranie z urzadzenia wymiany) odpowiadaja za realizacje stronicowania - podstawowej strategii zarzadzania pamiecia w Linuxie. Termin blad strony (ang. page fault) zostal nieco niefortunnie przetlumaczony. W praktyce powinien byc rozumiany jako programowo kontrolowany dostep do pamieci wirtualnej (tzn. w jej pelnym logicznym zakresie realizowanym przez system). Zatem zazwyczaj nie jest to blad w sensie niepoprawnie dzialajaacego procesu, a jedynie w sensie braku mozliwosci zrealizowania przez CPU (a dokladniej MMU - memory management unit - sprzetowy mechanizm translacji adresow i kontroli praw dostepu do pamieci) zadania bezposredniego dostepu do pamieci fizycznej. Bledy stron sa bowiem zglaszane przez MMU w postaci przerwan w pewnych scisle okreslonych sytuacjach . Bledy strony sa bledami dwojakiego rodzaju: braku strony oraz naruszenia prawa dostepu do strony. Ponadto kazdy z nich moze miec wiele przyczyn zaleznych zarowno od szeroko pojetego stanu systemu jak rowniez typu i mozliwosci sprzetu. Poniewaz jednak w obu przypadkach postepowanie wstepne jest bardzo podobne, w toku prac nad wersja 2.1 przewiduje sie polaczenie dwoch oddzielnych funkcji do_no_page() i do_wp_page() w jedna uniwersalna handle_mm_fault(). Przy obsludze bledow stron linux nie wykorzystuje zadnych specjalnych struktur poza opisanymi przy okazji wyjasniania dzialania strategii stronicowania.


Czesc zalezna od sprzetu

Blad strony.

Na najnizszym poziomie, funkcja niemal bezposrednio obslugujaca przerwanie bledu strony jest
do_page_fault(struct pt_regs *regs, unsigned long error_code)
Jedynie fragmenty kodu w asemblerze posrednicza w przygotowaniu argumentow dla funkcji po wystapieniu przerwania.


Szczegoly techniczne.

Warto byloby wspomniec o tym, ze w zaleznosci od architektury struktura drzewiasta slownika adresow stron moze byc mniej lub bardziej rozbudowana (co ma wplyw na efektywnosc sprzetowych i programowych algorytmow realizujacych strategie stronicowania). W szczegolnosci Linux jest w stanie obslugiwac trzy poziomy zagniezdzen; w Intelu sprzet zapewnia realizacje dwoch poziomow (podobnie MIPS i PPC), Alpha umozliwia trzypoziomowe zagniezdzanie, natomiast procesory Motoroli udostepniaja az szesc poziomow zagniezdzen, podczas gdy w procesorach Sparc istnieje nawet mozliwosc dynamicznej kontroli glebokosci drzewa. W przypadku mplementacji Linuxa/AXP, Linuxa/68k, Linuxa/SPARC w pelni wykorzystane sa mozliwosci trzypoziomowego zagniezdzania.

Ponadto trzeba by jeszcze zaznaczyc, ze w wiekszosci dokumentacji, opis pewnych stalych sprzetowych (a w konsekwencji rowniez implementacji pewnych fragmentow kodu) prawdziwy jest tylko dla procesora Intel. Np. w MMU Motoroli istnieja bity odpowiadajace za page write thru, page cache disabe, i jeszcze kilka innych flag okreslajacych dzialanie cache'a, sa rowniez zaimplementowane w linuxie/68k metody to wykorzystujace; na Alphie natomiast jest od groma bitow okreslajacych prawa dostepu (odczyt/zapis/wykonywane/ostatno odczytana/ostatnio zapisana...) i rowniez mozna sie doszukac wykorzystania tych mozliwosci w Linuxie/AXP.


Czesc niezalezna od sprzetu

Struktury.

Slowo struktury jest tu nieco na wyrost, jednak jest kilka zmiennych globalnych, o ktorych warto wspomniec przy okazji tego tematu. Zmienne te dotycza statystyk systemowych zwiazanych z istnieniem procesu i znajduja sie w strukturze task_struct oraz mm_struct.

Brak strony.

Generalnie blad ten pojawia sie w momencie gdy zadamy dostepu do strony pamieci wirtualnej, ktorej zawartosc nie istnieje w pamieci RAM adresowanej przez CPU. Obejmuje to zarowno przypadek gdy strona moze byc przeczytana z urzadzenia wymiany jak i fakt odwolania sie do strony, ktora w danym momencie wogole nie jest przydzielona. Jednak w zaleznosci od mozliwosci sprzetu (wiekszosc architektur RISCowych umozliwia przechowywanie dosyc ograniczonego zestawu informacji dotyczacych przyczyn wystapienia bledu strony. Nie nalezy jednak wyciagac z tego faktu mylnych wnioskow iz procesory Intela posiadaja wiecej cech charakterystycznych dla modelu RISC) przerwanie braku strony moze byc rowniez wykorzystane w celu implementacji brakujacych bitow takich jak wiek strony, rozne tryby obslugi sprzetowej pamieci podrecznej (page write thru, page cache disable...), czy nawet naruszenie ochrony strony.

Funkcja odpowiedzialna za obsluge przerwania braku strony jest
void do_no_page(struct task_struct * tsk, struct vm_area_struct * vma, unsigned long address, int write_access)


Naruszenie praw ochrony strony.

Z tym bledem mamy do czynienia w przypadku gdy zapis danych do strony pamieci jest zabroniony, badz zapis ten wiaze sie z koniecznoscia wykonania dodatkowych czynnosci na poziome programowym. I tak:

Funkcja odpowiedzialna za obsluge bledu ochrony strony jest
void do_wp_page(struct task_struct * tsk, struct vm_area_struct * vma, unsigned long address, int write_access)


Nowe rozwiazanie.

Jak mozna zauwazyc, wiele przypadkow dla funkcji obslugujacych bledy braku i ochrony strony, przeplata sie nawzajem, a nawet istotna czesc kodu dla obu funkcji jest bardzo podobna. Dlatego postanowiono, ze w najblizszym czasie obie funkcje zostana polaczone w jedna funkcje handle_mm_fault(). W chwili obecnej w wersji 2.1.5 z polaczonego kodu korzystaja platformy z procesorami MIPS, SPARC, ALPHA i PPC, jednak wlasciwa funkcja zajmuje sie w tej chwili tylko przygotowaniem odpowiednich argumentow natomiast znaczna czesc kodu jest zaimplementowana w czesci zaleznej od sprzetu (poniewaz realizacja jest w wiekszosci bardzo podobna, nalezy sie spodziewac stworzenia wspolnej implementacji w oparciu o te powstale dotychczas). Jedynie platformy i386 i m68k wykorzystuja stare funkcje do_no_page() i do_wp_page(), w oczekiwaniu na dzialajaca funkcje wspolna.


Bibliografia.

  1. Pliki zrodlowe Linuxa:
  2. Kernel Hacker's Guide.
  3. Mlitary Intel 486 processor family.
  4. M68030 USER'S MANUAL.
  5. M68040 USER'S MANUAL.
  6. M68060 USER'S MANUAL.
  7. Maurice J. Bach, Budowa systemu operacyjnego Unix, WNT 1995.

Autor: (C)1997 Szymon Stasik