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