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
Konfigurowanie i start Ładowanie i start systemu OS 9 W chwili startu systemu OS 9 (od punktu wejścia M$Exec modułu kernel ) w pami eci musz a si e znajdować: moduły systemowe kernel i init, program uruchamiany jako pierwszy proces (zazwyczaj sysgo), moduł sterownika zegara czasu rzeczywistego, moduły tworz ace podsystemy we wy dla konsoli systemowej i dysku systemowego (jeśli s a przewidziane w konfiguracji). UWAGA: Załadowanie tych modułów do pami eci, znalezienie modułu kernel, zainicjalizowanie rejestrów procesora i skok do procedury startowej j adra musi wykonać program spoza systemu, tzw. bootstrap loader, najcz eściej rezyduj acy w pami eci stałej komputera (ROM) i uruchamiany po sprz etowym restarcie (RESET ). MW-ZPCiR-ICT-PWr 17
Konfigurowanie i start Budowa i funkcje programu bootstrap plik procedura wykonywane zadania źródłowy sysinit.a SysInit pocz atkowa inicjalizacja sprz etu boot.a budowa tablic skoków do procedur obsługi wyj atków boot.a określenie MPUType (typu procesora) sysinit.a SInitTwo dokończenie inicjalizacji sprz etu odblokowanie przerwań boot.a poszukiwanie pami eci i budowa listy pami eci RAM i ROM sysboot.a SysBoot ładowanie systemu (doł aczenie obszaru do listy ROM) i poszukiwanie modułu kernel boot.a ustawienie rejestrów i skok do miejsca startu kernel-a (M$Exec) UWAGA: Plik boot.a jest niezależny od sprz etu (dostarczany przez MICROWARE), a pliki sysinit.a, sysboot.a zależne (tworzone przez autora implementacji). MW-ZPCiR-ICT-PWr 18
Konfigurowanie i start Struktura pami eci przygotowanej przed startem j adra systemu (kernel) Obszar zmiennych w pami eci RAM o wielkości 8 kb: 0 2539 tablica skoków do procedur obsługi wyj atków (2540 bajtów), 2540 4095 obszar na stos roboczy bootloader-a (wskazywany przez rejestr wskaźnika stosu a7), 4096-8191 obszar na globalne zmienne systemowe (D ), wskazywany przez a6. UWAGA: Tablica skoków zawiera 254 elementy stanowi ace indywidualne punkty wejścia procedur obsługi bł edów: PEA #N*4 adres wektora na stos JMP BadExcpt skok do obslugi w boot.a W sytuacji wyj atkowej na stosie składowany jest adres wektora i nastepuje skok do procedury obslugi (pocz atkowo wszystkie prowadz a do procedury BadExcpt z pliku boot.a). MW-ZPCiR-ICT-PWr 19
Konfigurowanie i start Lista pamieci RAM i ROM przygotowana przez bootstrap dla kernel Znalezione bloki pami eci RAM s a ł aczone w list e wskazywan a przez a4: a4 next block... 0 block size block size...... Znalezione bloki pami eci ROM s a zapami etywane na stosie (a7): a7 last block addr last block size... 1-st block addr 1-st block addr MW-ZPCiR-ICT-PWr 20
Konfigurowanie i start Przygotowanie rejestrów do uruchomienia kernel-a d0.l = ilość wolnej pami eci RAM d1.b = typ procesora (MPUType) d2.b = flaga debugger-a (0=brak) d3.l = typ restartu 0-cold (1-quick) d4.l = 0 d5.l = 0 d6.l = 0 d7.l = 0 (a0) = adres startu znalezionego modułu kernel (a1) = adres startu bootstrap (przy bł edzie fatalnym) (a2) = 0 (a3) = 0 (a4) = wskaźnik listy wolnej pami eci RAM (a5) = adres tablicy skoków dla wyj atków (a6) = adres obszaru zmiennych globalnych(d ) (a7) = mapa pami eci ROM MW-ZPCiR-ICT-PWr 21
Konfigurowanie i start Procedura startowa j adra systemu (kernel ) 1. Poszukiwanie modułów w pami eci ROM (z listy na stosie), sprawdzanie ich poprawności (CRC) i dodawanie ich do systemowej kartoteki modułów. 2. Doł aczenie (F$Link) do modułu konfiguracyjnego init (jego brak jest bł edem fatalnym). 3. Zainicjalizowanie wszystkich tablic i struktur systemowych, otwarcie domyślnych ścieżek we wy systemowych (zazwyczaj /term ) i domyślnych katalogów na dysku systemowym (zazwyczaj /dd ). 4. Uruchomienie (F$Fork) pierwszego procesu (zazwyczaj sysgo ). 5. Uruchomienie procesu systemowego (kod w kernel, ID=1), niewidocznego dla użytkownika, obsługuj acego funkcje czasu rzeczywistego (przerwania od RTC). 6. Koniec procedury startowej. MW-ZPCiR-ICT-PWr 22
Konfigurowanie i start Moduł konfiguracyjny init typedef struct { struct modhcom _mh; /* common header info */ long _mmaxmem; /* top limit of free ram */ ushort _mpollsz, /* number of IRQ polling /* tbl entries */ _mdevcnt, /* number of device table /* entries */ _mprocs, /* number of process table /* entries */ _mpaths, /* number of path table /* entries */ _msysparam, /* offset to parameter string for _msysgo */ _msysgo, /* offset to initial module name */ _msysdrive, /* offs. to sys. dev. name */ _mconsol, /* offset to console name */ _mextens, /* offset to customization module name list */ _mclock, /* offset to clock module name */ MW-ZPCiR-ICT-PWr 23
Konfigurowanie i start _mslice, /* number of clock ticks per time slice */ _mip_id; /* interprocessor identif. */ long _msite; /* installation site code */ ushort _minstal; /* installation name offs. */ long _mcputyp; /* cpu class (000/.../070) */ char _mos9lvl[4]; /* system lvl/ver./edition */ ushort _mos9rev, /* offs. to lvl/rev string */ _msyspri, /* initial system priority */ _mminpty, /* initial min. executable priority */ _maxage; /* initial maximum natural process age */ long _mmdirsz; /* nbr of moddir entries */ ushort _mevents; /* number of system event table entries */ char _mcompat, /* ver. change byte #1 */ _mcompat2; /* ver. change byte #2*/ ushort _mmemlist, /* offs. to col. mem. list */ _stacksz, /* IRQ stack size (lwords) */ _mcoldretrys, /* coldstart chd retry ctr */ _mreserved[10];/* reserved space */ }mod_config; MW-ZPCiR-ICT-PWr 24
Konfigurowanie i start Typowy program startowy sysgo Entry lea Intercpt(pc),a0 os9 F$Icpt En0 * WELCOME message move.w #1,d0 std IO path move.l #Msg1Siz,d1 lea Msg1Str(pc),a0 os9 I$WritLn * F$STime move.l #$00080000,d0 00hhmmss move.l #$07c30000,d1 yyyymmdd rtc --> mm = 0: os9 F$STime set from chip bcc.s En1 move #1,d0 move.l #TimESiz,d1 lea TimEStr(pc),a0 os9 I$WritLn MW-ZPCiR-ICT-PWr 25
Konfigurowanie i start En4 * shell -p=" sh> " moveq #0,d0 any type module moveq #0,d1 default memory size moveq #ShellPSiz,d2 parmameter size moveq #3,d3 copy std I/O paths move.w #Priority,d4 medium priority lea ShellStr(pc),a0 process to create lea ShellPar(pc),a1 parameter string os9 F$Fork fork to new primary mod. bcc.s En41 move #1,d0 move.l #ShellESiz,d1 lea ShellEStr(pc),a0 os9 I$WritLn bra En1 En41 os9 F$Wait wait for process to die bra En0 MW-ZPCiR-ICT-PWr 26
Konfigurowanie i start *************************************************** Msg1Str dc.b " sysgo: WELCOME to V2.4",C$CR Msg1Siz equ *-Msg1Str TimEStr dc.b " sysgo: can t set sys clock",c$cr TimESiz equ *-TimEStr ChxEStr dc.b " sysgo: can t change exec dir to " ChxStr dc.b "/dd/cmds",c$cr ChxESiz equ *-ChxEStr ChdEStr dc.b " sysgo: can t change work dir to " ChdStr dc.b "/dd",c$cr ChdESiz equ *-ChdEStr ShellEStr dc.b " sysgo: ERROR - can t fork to " ShellStr dc.b " shell",0," " ShellPar dc.b -p= ",$22,śh> ",$22,C$CR ShellPSiz equ *-ShellPar ShellESiz equ *-ShellEStr MW-ZPCiR-ICT-PWr 27