Funkcje modułów w podsystemie wejścia wyjścia moduł przykład wykonywane zadania kernel kernel tworzenie i usuwanie: - deskryptorów ścieżek (path descriptors ), - elementów tablicy urz adzeń (device table entries ), - obszarów pami eci statycznej urz adzeń (device static storages ). FMan SCF obsługa plików i konwersja danych Driv sc332 bezpośrednia obsługa fizycznych urz adzeń (sprz etu), obsługa przerwań na niskim poziomie; czasem przetwarzanie niskiego poziomu (reakcja na znaki steruj ace, realizacja niskiego poziomu protokołu komunikacji) MW-ZPCiR-ICT-PWr 1
Struktura pami eci statycznej urz adzenia wymagana przez kernel typedef struct sysiost { u_char *v_port; /* device base port address */ u_short v_lprc; /* last active process ID */ u_short v_busy; /* current process ID (0=not busy) */ u_short v_wake; /* active process ID for driver to wake */ union pathdesc *v_paths; /* list of open paths on device */ u_int v_dumm1[8]; /* reserved */ } sysiostatic; MW-ZPCiR-ICT-PWr 2
Struktura pami eci statycznej urz adzenia SCF typedef struct scfstatic { sysiostatic v_sysio; /* kernel static storage */ struct scfstatic *v_dev2; /* attached device s static storage ptr */ char v_type, /* device type or parity */ v_line, /* lines left til page end */ v_pause, /* immediate pause request */ v_intr, /* keyboard interrupt char */ v_quit, /* keyboard quit char */ v_pchr, /* pause character */ v_err, /* accumulated errors */ v_xon, /* x-on character */ v_xoff; /* x-off character */ short v_resv1[5]; /* reserved (for pipeman) */ u_char v_hangup; /* set to non-zero when data carrier is lost */ u_char v_pad1; /* spare */ u_char v_resv2[6]; /* reserved */ } *Scfstatic; MW-ZPCiR-ICT-PWr 3
Struktura pami eci statycznej urz adzenia RBF typedef struct rbfstatic { sysiostatic v_sysio; /* kernel static storage */ u_char v_ndrv; /* number of drives */ u_char v_dumm1[7]; /* reserved */ #ifndef RBF_MAXDRIVE #define RBF_MAXDRIVE 1 #endif struct rbfdrive drv[rbf_maxdrive]; /* rbf drive table */ } *Rbfstatic; typedef struct rbfdrive { struct sect0std v_0; /* standard sector zero */ u_short v_trak; /* current track */ union pathdesc* v_filehd; /* list of open files */ MW-ZPCiR-ICT-PWr 4
u_short v_diskid; /* disk ID number */ u_short v_bmapsz; /* bitmap size */ u_short v_mapsct; /* lowest bitmap byte to search */ u_short v_bmb; /* bitmap in use flag */ Sector0 v_sczero; /* pointer to sector zero buffer */ u_char v_zerord; /* sector zero read flag */ u_char v_init; /* drive initialized flag */ u_short v_resbit; /* reserved bitmap sector number (if any) */ u_int v_softerr; /* recoverable error count */ u_int v_harderr; /* non-recoverable err. cnt */ struct cachedriv *v_cache; /* drive cache inf. ptr */ u_int v_dtext; /* drive table extension pointer */ u_short v_maxmap; /* maximum bitmap sect. nbr */ u_short v_dumm2; /* reserved */ u_int v_dumm1[5]; /* reserved */ } *Rbfdrive; MW-ZPCiR-ICT-PWr 5
Opcje w deskryptorze ścieżki dla SCF struct scf_opt { u_char pd_dtp; /* device type */ u_char pd_upc; /* case (0=both, 1=upper only) */ u_char pd_bso; /* backsp (0=bse, 1=bse,sp,bse) */ u_char pd_dlo; /* delete (0=bse over line, 1=crlf) */ u_char pd_eko; /* echo (0=no echo) */ u_char pd_alf; /* autolf (0=no auto lf) */ u_char pd_nul; /* end of line null count */ u_char pd_pau; /* pause (0=no pause) */ u_char pd_pag; /* lines per page */ u_char pd_bsp; /* backspace character */ u_char pd_del; /* delete line character */ u_char pd_eor; /* end of record char (rd only) */ u_char pd_eof; /* end of file char */ u_char pd_rpr; /* reprint line char */ u_char pd_dup; /* dup last line char */ u_char pd_psc; /* pause char */ u_char pd_int; /* kbd intr char (ctl c) */ u_char pd_qut; /* kbd quit char (ctl q) */ MW-ZPCiR-ICT-PWr 6
u_char pd_bse; /* backspace echo character */ u_char pd_ovf; /* line overflow char (bell) */ u_char pd_par; /* parity code */ u_char pd_bau; /* acia baud rate */ short pd_d2p; /* dev2 output name offset */ u_char pd_xon; /* x-on char */ u_char pd_xoff; /* x-off char */ u_char pd_tab; /* Tab character (0=none) */ u_char pd_tabs; /* Tab field size */ Devicetbl pd_tbl; /* Device table addr (copy) */ u_short pd_col; /* current column number */ u_char pd_err; /* most recent I/O error status */ u_char pd_scfres2[61]; /* reserved for SCF usage */ u_char pd_gfmucm[32]; /* reserved for GFM/UCM usage */ }; MW-ZPCiR-ICT-PWr 7
Opcje w deskryptorze ścieżki dla RBF struct rbf_opt { u_char pd_dtp; /* device type */ u_char pd_drv; /* drive number */ u_char pd_stp; /* step rate */ u_char pd_typ; /* disk device type (3",...) */ u_char pd_dns; /* density capabilities */ u_char pd_res1; /* reserved */ u_short pd_cyl; /* number of cylinders */ u_char pd_sid; /* number of surfaces */ u_char pd_vfy; /* 0=verify disk writes */ u_short pd_sct; /* default sectors/track */ u_short pd_t0s; /* default sec./trk for trk0 */ u_short pd_sas; /* segment allocation size */ u_char pd_ilv; /* sector interleave offset */ u_char pd_tfm; /* DMA transfer mode */ u_char pd_toffs; /* track base offset */ u_char pd_soffs; /* sector base offset */ u_short pd_ssize; /* size of sector in bytes */ u_short pd_cntl; /* control word */ u_char pd_trys; /* # tries */ u_char pd_lun; /* SCSI unit number of drive */ MW-ZPCiR-ICT-PWr 8
u_short pd_wpc; /* write precomp cylinder */ u_short pd_rwr; /* reduced current cylinder */ u_short pd_park; /* park cylinder */ u_int pd_lsnoffs; /* LSN offset for partition */ u_short pd_totcyls; /* total cylinders on device */ u_char pd_ctrlrid; /* SCSI controller id */ u_char pd_rate; /* data-tfr/disk-rot. rate */ u_int pd_scsiopt; /* SCSI options flags */ u_int pd_maxcnt; /* maximum byte count */ u_char pd_res4[5]; /* reserved */ u_char pd_att; /* file attributes */ u_int pd_fd; /* LSN of file descriptor */ u_int pd_dfd; /* directory descriptor LSN */ u_int pd_dcp; /* directory entry pointer */ u_int pd_dvt; /* device table pointer*/ u_char pd_res3[2]; /* reserved */ u_int pd_sctsiz; /* sector size */ u_char pd_res5[20]; /* reserved */ char pd_name[32]; /* filename */ }; MW-ZPCiR-ICT-PWr 9
Procedury sterownika urz adzenia (tablica wskazywana przez pole M$Exec:) C asm znaczenie module.h module.a mdinit DInit Odst ep od procedury Init (inicjalizacja urz adzenia) mdread DRead Odst ep procedury Read (odczyt z urz adzenia) mdwrite DWrite Odst ep procedury Write (zapis na urz adzeniu) mdgetstat DGetStat Odst ep procedury GetStat (odczyt statusu urz adzenia) mdsetstt DSetStat Odst ep procedury SetStat (ustawienie statusu urz a- dzenia) mdterm DTerm Odst ep procedury Term (zakończenie pracy urz a- dzenia) mderror DError Odst ep procedury Error (obsługa wyj atków - 0=brak) MW-ZPCiR-ICT-PWr 10
Konwencja przekazywania parametrów dla procedur sterowników urz adzeń kernel dla DInit i DTerm: (a1) = adres deskryptora urz adzenia (a2) = adres pami eci statycznej urz adzenia (a4) = adres deskryptora procesu wywołuj acego (a6) = adres globalnych zmiennych systemowych (D ) FMan dla DRead, DWrite, DGetStat, DSetStat: (a1) = adres deskryptora ścieżki (a2) = adres pami eci statycznej urz adzenia (a4) = adres deskryptora procesu wywołuj acego (a5) = adres ramki stosu rejestrów użytkownika (a6) = adres globalnych zmiennych systemowych (D ) powrót z procedury po bł edzie: cc = ustawiony bit Carry d1.w = kod bł edu MW-ZPCiR-ICT-PWr 11
Obsługa DInit w ramach I$Attach Tylko przy tworzeniu nowego podsystemu we wy (alokacja nowej pami eci statycznej urz adzenia) Funkcje DInit: inicjalizacja pami eci statycznej urz adzenia (zazwyczaj tylko cz eści sterownika, czasem przekazanie parametrów urz adzenia dla FMan, np. ilość napedów V NDRV); inicjalizacja sprz etu dla nast epnych wywołań innych procedur sterownika (DRead,...) i przygotowanie do przekazywania danych; instalacja procedury obsługi przerwań (jeśli s a używane) w tablicy pollingu przerwań (przez F$IRQ). UWAGA: W przypadku urz adzeń dopuszczaj acych tylko jednokrotn a inicjalizacj e sprz etu po restarcie, można użyć pomocniczego modułu danych jako flagi dokonania inicjalizacji (próba utworzenia modułu zwróci bł ad E KWNMOD). MW-ZPCiR-ICT-PWr 12
Obsługa DTerm w ramach I$Detach Tylko przy likwidowaniu podsystemu we wy (gdy V USE = 0 w odpowiednim elemencie tablicy we wy) Funkcje DTerm: oczekiwanie na dokończenie działania funkcji write behind (transmisji bufora SCF lub zapisu na dysk RBF); zamkni ecie pracy sprz etu (zwłaszcza zablokowanie generacji przerwań); zwolnienie zasobów przydzielonych przez procedury sterownika (bufory danych, dowi azania do modułów lub zdarzeń, otwartych ścieżek,...); usuni ecie zainstalowanych przez DInit procedur obsługi przerwań (F$IRQ). UWAGA: kernel zwalnia pami eć statyczn a urz adzenia po zakończeniu procedury DTerm. MW-ZPCiR-ICT-PWr 13
Obsługa DRead w ramach I$Read dla SCF Odczyt jednego znaku z urz adzenia z oczekiwaniem na gotowość (wynik w d0.b). Procedura obsługi przerwania od RxRdy: wpisuje odebrany znak do bufora cyklicznego; ustawia znacznik bł edu V ERR przy bł edzie transmisji lub przepełnieniu bufora; budzi proces (F$Send) jeśli czekał na znak (był pusty bufor); wysyła znak PD XOFF przy zapełnieniu bufora (high water mark); Procedura DRead: pobiera znak z bufora cyklicznego (usypia proces przez F$Sleep jeśli bufor jest pusty); jeśli znacznik V ERR neq0 zwraca bł ad E$Read i zeruje V ERR; wysyła znak PD XON przy opróżnieniu bufora (low water mark); MW-ZPCiR-ICT-PWr 14
Obsługa DWrite w ramach I$Write dla SCF Wysłanie jednego znaku (w d0.b) do urz adzenia z oczekiwaniem na gotowość. Procedura obsługi przerwania od TxRdy: wpisuje znak bufora cyklicznego do rejestru urz adzenia; budzi proces (F$Send) jeśli czekał na miejsce w buforze (najcz eściej przy cz eściowym opróżnieniu bufora low water mark); jeśli bufor jest pusty, blokuje przerwania od TxRdy. Procedura DWrite: wpisuje znak do bufora cyklicznego (usypia proces przez F$Sleep jeśli bufor jest pełny); odblokowuje przerwania od TxRdy jeśli były zablokowane. UWAGA: znaki PD XOFF i PD XON s a wysyłane poza kolejności a. MW-ZPCiR-ICT-PWr 15
Obsługa DGetStat i DSetStat na przykładzie urz adzeń SCF Kod w d1.w dla usługi I$SetStt jest przekazywany przez kernel do FMan, a st ad do sterownika urz adzenia i obsługiwany kolejno na wszystkich poziomach (o ile jest znany) W przypadku nieznanego kodu bł ad E$UnkSvc. Przykład (kod SS Opt dla Set Status): kernel nie rozpoznaje kodu, przekazuje do FMan dla procedury FGetStat; FMan modyfikuje obszar opcji w deskryptorze ścieżki (PD Opt) i przekazuje kod do procedury DSetStat w sterowniku urz adzenia; Driv przekonfigurowuje sprz et według nowych parametrów (pr edkość i format transmisji,...) ustawionych w deskryptorze ścieżki. UWAGA: GetStat i SetStat umożliwiaj a zaimplementowanie dowolnych funkcji w sterowniku urz adzenia i module zarz adzania plikami (FMan). MW-ZPCiR-ICT-PWr 16