Zadanie 3 z podsystemu wejścia-wyjścia
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:
open
close
read
write
lseek
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
Wyszukiwarka
Podobne podstrony:
ZADANIE (11)zadaniegz 11ZADANIE (11)Analiza Zadania 11ZADANIE (11)ZADANIE (11)ZADANIE (11)ZADANIE (11)ZADANIE (11)ZADANIE (11)ZADANIE (11)ZADANIE (11)zadanie 11ZADANIE (11)ZADANIE (11)ZADANIE (11)ZADANIE (11)więcej podobnych podstron