materiały pomocnicze
Transkrypt
materiały pomocnicze
Obsługa wejścia–wyjścia w OS-9 Marek Wnuk < [email protected] > ZPCiR I-6 PWr MW: BRTOS7 – p.1/22 Przykłady funkcji wejścia-wyjścia int open (char * name, short mode); wejście (argumenty): name wskaźnik do nazwy pliku, mode tryb dostepu ˛ do pliku (opis w modes.h); wyjście (wynik): lokalny numer ścieżki (-1 = bład ˛ - kod w errno). int read (int path, char * buf, unsigned count); wejście (argumenty): path lokalny numer ścieżki, buf wskaźnik bufora dla odczytu, count maksymalna ilość bajtów do odczytania; wyjście (wynik): liczba bajtów rzeczywiście odczytanych (0 = koniec pliku, -1 = bład ˛ - kod w errno). MW: BRTOS7 – p.2/22 Usługi wejścia-wyjścia w OS–9 (1/3) I$Attach (Attach I/O Device) Przyłacza ˛ urzadzenie ˛ zapewniajac ˛ jego inicjalizacje, ˛ przydzielenie pamieci ˛ statycznej, umieszczenie w tablicy urzadze ˛ ń. I$Detach (Detach I/O Device) Odłacza ˛ urzadzenie. ˛ I$Dup (Duplicate Path) Powiela ścieżk˛e, dajac ˛ dodatkowy lokalny numer dla wcześniej otwartej ścieżki. I$Create (Create New File) Tworzy nowy plik i otwiera ścieżk˛e dostepu ˛ do niego. I$Open (Open Existing File) Tworzony deskryptor ścieżki ma pola PD_COUNT i PD_CNT ustawione na 1, PD_MOD - zgodnie z podanym trybem. PD_USER ustawia sie˛ na numer grupy i użytkownika procesu. Po wywołaniu I$Attach do PD_DEV wpisuje sie˛ adres miejsca w tablicy urzadze ˛ ń. MW: BRTOS7 – p.3/22 Usługi wejścia-wyjścia w OS–9 (2/3) I$Close (Close Path) Zamyka otwarta˛ ścieżk˛e. PD_COUNT i PD_CNT sa˛ zmniejszane, jeśli żaden inny proces z niej nie korzysta - jadro ˛ (kernel) wywołuje funkcje˛ close modułu obsługi plików. I$MakDir (Make Directory File) Podobnie, jak w I$Create, przy atrybytach directory. I$ChgDir (Change Default Directory) Tymczasowo otwiera ścieżk˛e, wywołuje funkcje˛ modułu obsługi plików i zamyka ścieżk˛e. Adres urzadzenia ˛ jest wpisywany do P$DIO - w deskryptorze procesu. I$Delete (Delete File) Tymczasowo otwiera ścieżk˛e, wywołuje moduł obsługi plików i zamyka ścieżk˛e. I$Seek (Change Current Position) Przestawia bieżacy ˛ wskaźnik w pliku (w otwartej ścieżce). I$Read (Read Data) Czyta do bufora dane bez ich modyfikowania z otwartej ścieżki. MW: BRTOS7 – p.4/22 Usługi wejścia-wyjścia w OS–9 (3/3) I$Write (Write Data) Pisze z bufora dane bez ich modyfikowania do otwartej ścieżki. I$ReadLn (Read Line of ASCII Data) Działa jak I$Read, lecz kończy czytanie na końcu linii (w OS–9 zazwyczaj CR=$13). I$WritLn (Write Line of ASCII Data) Działa jak I$Write, lecz zakłada, że moduł obsługi plików kończy na CR i dokonuje prostych konwersji (SCF - LF po CR, pauza po nowej stronie i rozwijanie tabulacji). I$GetStt (Get Path Status) Pozwala na dostep ˛ do takich własności urzadze ˛ ń we/wy, które nie sa˛ osiagalne ˛ w inny sposób. Wymaga otwartej ścieżki. Przy wywołaniu podaje sie numer funkcji, który jest specyficzny dla sterownika urzadzenia. ˛ I$SetStt (Set Path Status) Jak I$GetStt, ale dla zadawania parametrów urzadzeniom ˛ i realizowania specyficznych funkcji. MW: BRTOS7 – p.5/22 Hierarchiczna obsługa we–wy w OS–9 RSURJUDPRZDQLH *GDQLH SURJUDP X*\WNRZQLND RGELyUZ\QLNX system UR]SR]QDQLH Z\EyUSURJUDPX REVáXJL kernel (IOMan) SU]HND]DQLH Z\QLNX REVáXJDSRQDG SR]LRPHPVSU] WX File Manager NRRUG\QDFMD SU]HND]DQLD Z\QLNX REVáXJDVSU] WX Device Driver RGGDQLHZ\QLNX GDQ\FK VSU] W MW: BRTOS7 – p.6/22 Modułowy podsystem we–wy PRGXáREVáXJL SOLNyZ PRGXáGHVNU\SWRUD XU]G]HQLD 0,' 01DPH 07\SH 'HVF 0)0JU 03'HY 02SW "sc332" ... "SCF" ... "term" ... 0&5& 0,' 01DPH 07\SH )PDQ 0([HF &UHDWH 2SHQ "SCF" 0&5& PRGXáVWHURZQLND XU]G]HQLD 0,' 01DPH 07\SH 'ULY 0([HF 0',QLW 0'5HDG "sc332" 0&5& MW: BRTOS7 – p.7/22 Moduł deskryptora urzadzenia ˛ adr. C asm znaczenie module.h module.a 30 _mport M$Port Adres portu 34 _mvector M$Vector Wektor obsługi przerwań 35 _mirqlvl M$IRQLvl Poziom przerwania 36 _mpriority M$Prior Priorytet przerwania 37 _mmode M$Mode Zakres możliwosci urzadzenia ˛ 38 _mfmgr M$FMgr Adres nazwy modułu obsługi plików 3A _mpdev M$PDev Adres nazwy sterownika urz. 3C _mdevcon M$DevCon Adres obszaru parametrów spec. 3E ... ... Zarezerwowane 46 _mopt M$Opt Wielkość obszaru opcji 48 _mdtype M$DTyp Poczatek ˛ obszaru opcji – typ urz. MW: BRTOS7 – p.8/22 Tablica wejść modułu obsługi plików adres nazwa wykonywana czynność 0000 Create Tworzenie nowego pliku 0002 Open Otwieranie istniejacego ˛ pliku 0004 MakDir Tworzenie katalogu 0006 ChgDir Zmiana katalogu bieżacego ˛ 0008 Delete Kasowanie pliku 000A Seek Przesuwanie wskaźnika pozycji odczytu/zapisu 000C Read Odczyt znaku (bajtu) z pliku 000E Write Zapis znaku (bajtu) do pliku 0010 ReadLn Odczyt linii (rekordu) z pliku 0012 WriteLn Zapis linii (rekordu) do pliku 0014 GetStat Odczyt statusu pliku 0016 SetStat Ustawienie statusu pliku 0018 Close Zamykanie pliku MW: BRTOS7 – p.9/22 Tablica wejść sterownika urzadzenia ˛ adr. C asm znaczenie module.h module.a 3C _mdinit M$DInit Odstep ˛ od procedury Init (inicjalizacja urzadzenia) ˛ 3E _mdread M$DRead Odstep ˛ procedury Read (odczyt z urzadzenia) ˛ 40 _mdwrite M$DWrite Odstep ˛ procedury Write (zapis na urzadzeniu) ˛ 42 _mdgetstat M$DGetStat Odstep ˛ procedury GetStat (odczyt statusu urzadzenia) ˛ 44 _mdsetstt M$DSetStat Odstep ˛ procedury SetStat (ustawienie statusu urzadzenia) ˛ 46 _mdterm M$DTerm Odstep ˛ procedury Term (zakończenie pracy urzadzenia) ˛ 48 _mderror M$DError Odstep ˛ procedury Error (obsługa wyjatków ˛ - 0=brak)MW: BRTOS7 – p.10/22 Systemowa tablica urzadze ˛ ń Statyczna tablica device table o stałej wielkości, wskazywana przez zmienna˛ globalna˛ D_DevTbl, zawierajaca ˛ struktury opisujace ˛ zainicjowane urzadzenia: ˛ adres nazwa znaczenie 0000 V$DRIV Adres modułu sterownika urzadzenia ˛ (device driver) 0004 V$STAT Adres bazowy pamieci ˛ statycznej przydzielonej sterownikowi urzadzenia ˛ 0008 V$DESC Adres modułu deskryptora urzadzenia ˛ (device descriptor) 000C V$FMGR Adres modułu obsługi plików dla urzadzenia ˛ (file manager) 0010 V$USRS Licznik użyć urzadzenia ˛ MW: BRTOS7 – p.11/22 Deskryptor ścieżki (path descriptor) adres nazwa znaczenie 0000 PD_PD Systemowy numer ścieżki 0002 PD_MOD Flagi trybu 0004 PD_DEV Adres w tablicy urzadze ˛ ń 0008 PD_CPR ID aktualnego procesu 000a PD_RGS Adres ramki stosu procesu 000e PD_BUF Adres bufora danych 0012 PD_USER Numer grupy i ID użytkownika 0016 PD_Paths Nastepna ˛ scieżka na urzadzeniu ˛ 001a PD_COUNT Licznik użyć scieżki 001c PD_LProc ID ostatniego procesu 001e PD_ErrNo Numer ostatniego błedu ˛ 0022 PD_SysGlob Wskaźnik pamieci ˛ globalnej 0080 PD_OPT Obszar opcji MW: BRTOS7 – p.12/22 Systemowa tablica ścieżek Tablica wskazywana przez zmienna˛ globalna˛ D_PthDBT, zawierajaca ˛ adresy deskryptorów otwartych ścieżek dost˛epu do plików (indeks tablicy odpowiada numerowi ścieżki): indeks odstep ˛ zawartość 0 0000 Wielkość tablicy ścieżek 0002 Rozmiar deskryptora (256) 1 0004 Adres deskryptora #1 (0=brak) 2 0008 Adres deskryptora #2 (0=brak) 3 000C Adres deskryptora #3 (0=brak) 4 0010 Adres deskryptora #4 (0=brak) 5 0014 Adres deskryptora #5 (0=brak) ... ... ... MW: BRTOS7 – p.13/22 Tablica translacji ścieżek procesu 32-elementowa tablica (P$Path) w deskryptorze procesu zawierajaca ˛ systemowe numery otwartych ścieżek dost˛epu do plików (indeks tablicy odpowiada lokalnemu numerowi ścieżki): adres indeks zawartość 0168 0 Numer ścieżki systemowej dla stdin (0=brak) 016A 1 Numer ścieżki systemowej dla stdout (0=brak) 016E 2 Numer ścieżki systemowej dla stderr (0=brak) 0170 3 Numer ścieżki systemowej dla lokalnej ścieżki #3 (0=brak) 0172 4 Numer ścieżki systemowej dla lokalnej ścieżki #4 (0=brak) ... ... ... 01A6 31 Numer ścieżki systemowej dla lokalnej ścieżki #31 (0=brak) MW: BRTOS7 – p.14/22 Klasy urzadze ˛ ń wejścia-wyjścia w OS–9 Opisane przez kod M$DTyp w deskryptorze urzadzenia ˛ kod nazwa typ urzadzenia ˛ 0 DT_SCF znakowe o dostepie ˛ szeregowym (drukarka,...) 1 DT_RBF blokowe o dostepie ˛ dowolnym (dyski) 2 DT_Pipe pseudopliki (łacza ˛ – bufory FIFO) 3 DT_SBF blokowe o dostepie ˛ szeregowym (taśma) 4 DT_NFM pliki dostepne ˛ sieciowo 5 DT_CDFM pliki na nośniku CD–I 6 DT_UCM komunikacja z użytkownikiem CD–I 7 DT_SOCK logiczne urzadzenie ˛ sieciowe (gniazdko BSD) 8 DT_PTTY pseudo–terminal 9 DT_INET internetowe urzadzenie ˛ sieciowe (protokół IP) 10 DT_NRF nieulotna pamieć ˛ RAM (CD–I) 11 DT_GFM urzadzenie ˛ do wyświetlania grafiki (CD-I) MW: BRTOS7 – p.15/22 Funkcje FM dla różnych klas urzadze ˛ ń nazwa typ urzadzenia ˛ funkcji DT_SCF DT_RBF Create + + Open + + MakDir E$BPNAM + ChgDir E$BPNAM + Delete E$BMODE + Seek – + Read + + Write + + ReadLn + + WriteLn + + GetStat + + SetStat + + Close + + MW: BRTOS7 – p.16/22 Obsługa I$Read i I$Write Przesłanie zadanej liczby bajtów z / na urzadzenie ˛ bez przetwarzania danych. RBF: E$EOF (end–of–file-error ) jest zwracany, gdy przy odczycie pierwszego bajtu wskaźnik pozycji odczytu jest na końcu pliku. SCF: E$EOF (end–of–file-error ) jest zwracany, gdy pierwszy odczytany znak jest równy PD_EOF (end–of–file-character ); PD_EOR (end–of–record ) 6= 0 ⇒ zakończenie I$Read na znaku równym PD_EOR; PD_PAU (page–pause–flag ) 6= 0 ⇒ zatrzymanie wyjścia po PD_PAG (page–length ) znakach końca linii (< CR >) od ostatniego wejścia. . MW: BRTOS7 – p.17/22 Obsługa I$ReadLn i I$WriteLn Przesłanie zadanej liczby znaków z / na urzadzenie ˛ z przetwarzaniem. RBF: jak w I$Read, I$Write, koniec na znaku < CR >. SCF: jak w I$Read, I$Write, dodatkowo – możliwość edycji linii wejściowej, koniec na znaku < CR >; Flagi konwersji w opcjach deskryptora ścieżki: PD_ALF < LF > automatycznie dodawany po < CR >; PD_UPC konwersja na duże litery. Znaki sterujace ˛ edycja˛ linii wejściowej definiowane w opcjach deskryptora ścieżki: PD_PSC znak zatrzymujacy ˛ wyjście przed < CR > (ˆ S); PD_Tab znak tabulacji (ˆ I) – szerokość = PD_Tabs; PD_BSP znak cofania kursora (ˆ H); PD_DEL znak kasowania linii (ˆ X). MW: BRTOS7 – p.18/22 Kody I$GetStt i I$SetStt dla RBF Kody przekazywane do sterownika urzadzenia ˛ przy wywołaniach M$DGetStat i M$SetStat (definiowane dowolnie dla różnych klas urzadze ˛ ń). E$UnkSvc - kod nieznany dla danej klasy. GetStat: ˛ danych, SS_Ready sprawdzenie dostepności SS_Size odczyt rozmiaru pliku, SS_Pos odczyt położenia wskaźnika w pliku, SS_EOF sprawdzenie warunku końca pliku, SS_FD odczyt sektora deskryptora pliku na dysku; SetStat: SS_Open zawsze przy I$Create i I$Open, SS_Close zawsze przy I$Close, SS_Opt modyfikacja opcji deskryptora ścieżki, SS_Size ustawienie nowego rozmiaru pliku, SS_FD modyfikacja deskryptora pliku na dysku, SS_Attr zmiana zezwoleń na dostep ˛ do pliku MW: BRTOS7 – p.19/22 Sekwencja wywołań procedur we–wy program kernel FMan Driv ,5HDG )5HDG '5HDG ,6OHHS USER SYSTEM RDY HW MW: BRTOS7 – p.20/22 Potoki (pipes) w OS–9 bufor FIFO (First-In-First-Out) zazwyczaj jeden proces czyta, jeden lub wiele pisze File Manager: pipeman Device Driver: null Device Descriptor: pipe Tworzenie i otwieranie potoku bez nazwy: pn=create("/pipe",S_IREAD|S_IWRITE,S_IREAD|S_IWRITE); pn=open("/pipe",S_IREAD|S_IWRITE); Tworzenie i otwieranie potoku nazwanego: pn=create("/pipe/foo",S_IREAD|S_IWRITE,S_IREAD|S_IWRITE); pn=open("/pipe/foo",S_IREAD|S_IWRITE); MW: BRTOS7 – p.21/22 Sprz˛eganie procesów przez potoki copy_in=dup(0); copy_out=dup(1); /* kopia stdin */ /* kopia stdout */ close(1); /* zamkniecie stdout */ path=create("/pipe",S_IREAD|S_IWRITE,S_IREAD|S_IWRITE); /* potok bedzie mial numer sciezki 1 (pierwsza wolna) */ pid_1=os9exec(os9fork,"prg1",args1,environ,0,0); /* utworzenie pierwszego procesu (dziedziczy trzy sciezki) */ close(0); /* zamkniecie stdin */ dup(1); /* kopia sciezki do potoku z numerem 0 (stdin) */ close(1); /* zamkniecie potoku (stdout) */ dup(copy_out); /* odtworzenie oryginalnego stdout z kopii */ pid_2=os9exec(os9fork,"prg2",args2,environ,0,0); /* utworzenie drugiego procesu (dziedziczy trzy sciezki) */ close(0); dup(copy_out); close(copy_in); close(copy_out); /* /* /* /* zamkniecie potoku (stdin) */ odtworzenie stdin z kopii */ zamkniecie kopii stdin */ zamkniecie kopii stdout */ MW: BRTOS7 – p.22/22