next up previous contents
Next: Postarzanie stron (ang. page Up: Pamięć Wirtualna w Linuksie Previous: System bliźniaków   Spis rzeczy

Obsługa błędów strony

Na różnych architekturach występują różnice w ,,niskopoziomowej'' obsłudze błędu strony. Podstawowe kwestie, które trzeba rozstrzygnąć to: czy błąd spowodował użytkownik, czy jądro; sprawdzenie praw dostępu do strony; sprawy stosu.

Podczas błędu braku strony jądro patrzy, czy pożądanej strony nie ma w pamięci podręcznej stron. Jeżeli znajdzie to przenosi ją na listę stron aktywnych (jeśli jeszcze jej tam nie ma) i natychmiast obsługuje błąd.

Jeżeli jesteśmy w trakcie obsługi przerwania lub nie ma kontekstu użytkownika, to znaczy, że błąd spowodowało jądro. Następuje wtedy próba naprawienia odwołania i w przypadku niepowodzenia system pada (oops).

Jeżeli błąd jest zgłaszany ,,z procesu użytkownika'' (mamy kontekst) to sprawdzamy poprawność adresu w tym kontekście. Jeżeli coś się nie zgadza to zabijamy proces.

Niezależnie od architektury po stwierdzeniu poprawności odwołania próbujemy obsłużyć błąd. Są cztery przypadki:

  1. Strony nie ma w pamięci i nigdy nie było: najpierw patrzymy, czy strony nie da się dzielić z jakąś inną (jeżeli da się i wymagamy pisania, to strona jest kopiowana), jeżeli nie da się dzielić i chcemy pisać to przydzielana jest nowa, czysta ramka, jeżeli chcemy czytać to podstawiana jest ramka wypełniona zerami (ZERO_PAGE - jedna na cały system).

  2. Strony nie ma w pamięci, ale była wcześniej wykorzystywana: ściągamy ją z pliku wymiany (lub jego pamięci podręcznej jeżeli tam jest).

  3. Ramka jest w pamięci: chcemy na niej pisać i jeżeli mamy odpowiednie prawa, to zaznaczamy stronę jako ,,brudną'' i ,,odmładzamy'' ją, jeżeli chcemy czytać to odwzorowujemy stronę i ,,odmładzamy''.

  4. Może się zdarzyć, że chcemy pisać na stronie tylko do odczytu. Jest to możliwe w przypadku kiedy tworzymy proces używając techniki kopiowania przy zapisie (ang. Copy-On-Write), jeżeli strona jest współdzielona. Jeżeli na pewno nie jest to błąd, to przydzielamy nową stronę i kopiujemy starą.

W między czasie może wystąpić inny błąd np. błąd szyny. Wtedy kończymy proces, bo i tak w kółko występowałby błąd braku strony.


next up previous contents
Next: Postarzanie stron (ang. page Up: Pamięć Wirtualna w Linuksie Previous: System bliźniaków   Spis rzeczy
Jarek Babel 2002-12-10