Zadanie 3 z podsystemu wejścia-wyjścia

Prosta implementacja podprogramu obsługi "pamięci dzielonej"


Zadanie polega na napisaniu podprogramu obsługi pewnego "wirtualnego" urządzenia.

Urządzenie to ma działać jak plik o stałej długości. Znaczy to, że można pisać na urządzenie tak, jak na zwykły plik. Można też z niego czytać. Obie te operacje mają zachowywać się w sposób możliwie podobny do zachowania read/write na zwykłych plikach.

W kodzie podprogramu ma być zdefiniowana stała, która określa długość "pliku" udostępnianego przez urządzenie. Każda próba zapisania bajtu na pozycję w pliku, która jest mniejsza od tej stałej (i nieujemna), ma się zakończyć sukcesem. Obsługa błędów takich, jak czytanie i pisanie za końcem pliku, ma być taka, by polecenia:
cat /dev/moje_urządzenie
oraz
more /dev/moje_urządzenie
zachowywały się możliwie sensownie (należy więc zbadać, jak te polecenia się na tworzonym urządzeniu zachowują).

Urządzenie ma przechowywać swoje dane w pamięci operacyjnej, a nie na dysku (przynajmniej dopóty, dopóki jest otwarte).

Wszystkie procesy w systemie, nawet jeżeli otworzyły urządzenie z różnych punktów systemu plików, mają mieć dostęp do tych samych danych. Rozumiem przez to, że jeżeli proces P1 zapisze '#' pod pozycją x, a następnie proces P2 odczyta pozycję x, to P2 powinien odczytać '#'. Chodzi więc o to, by tworzone urządzenie było implementacją pewnego rodzaju pamięci dzielonej.

Urządzeniu należy przypisać jakiś dotychczas niezajęty numer główny. Numer drugorzędny można interpretować dowolnie.

Jeżeli ktoś otwiera urządzenie jako pierwszy (tzn. otwiera urządzenie, które w tym momencie nie jest otwarte przez nikogo), to ma pojawić się na ekranie komunikat. Podobnie, jeśli proces zamyka urządzenie jako ostatni, to na ekranie ma się pojawić komunikat o tym (można korzystać z funkcji printk).

Urządzenie ma poprawnie reagować na wywołanie na nim funkcji lseek (poprawnie oznacza: możliwie podobnie do zwykłych plików). Należy odpowiednio obsługiwać błędy. Podkreślam, że przewinięcie za koniec pliku nie jest błędem.

Jeżeli ktoś jest ambitniejszy, to może spróbować zaimplementować urządzenie tak, by jego dane zachowywały się w wypadku restartowania systemu. Można to zrobić za pomocą modyfikacji w skryptach systemowych. Bardziej elegancką metodą byłoby zachowywać dane urządzenia podczas release. Ponieważ takie zadanie wymagałoby pewnej wiedzy z dziedzin innych niż podsystem wejścia-wyjścia, więc jest tylko dla chętnych.

Jeżeli ktoś realizuje zadanie mniej ambitne, to po inicjalizacji systemu dane urządzenia mają być ciągiem samych zer.

Urządzenie ma się samo inicjalizować podczas startu systemu wraz z pozostałymi urządzeniami.


Obowiązkowo należy, jako "dowód poprawności" rozwiązania, przygotować programik, który będzie pozwalał na interakcyjne wykonanie operacji:

Jakość tego programiku nie jest istotna - ważne, żeby wykazywał on, że operacje na urządzeniu wykonują się poprawnie (w szczególności powinien wyświetlać kody ewentualnych błędów).


Autor: Piotr Hoffman