Tajemnice ATARI

DYSKOWE SYSTEMY OPERACYJNE (3)

    Zgodnie z obietnicą zawartą w drugim odcinku niniejszego cyklu artykuł poświęcony jest w całości operacjom na dysku. Będzie to opis czynności, jakie Dyskowy System Operacyjny wykonuje podczas uaktywniania napędu dyskietek. Bardzo często zastanawiamy się: Co naprawdę dzieje się podczas pracy stacji dysków, dlaczego sektory są raz czytane, raz zapisywane (rozpoznajemy to po dźwięku) i dlaczego używane są pewne określone sektory do różnych celów?

   Do operacji na dyskietce zaliczamy: jej formatowanie (FORMAT), nagrywanie pliku (SAVE), wgrywanie pliku (LOAD), kasowanie pliku (DELETE lub ERASE), zmianę nazwy pliku (RENAME). Są to operacje podstawowe dla każdego DOS-u. Co się dzieje, gdy rozkażemy Dyskowemu Systemowi Operacyjnemu dokonać określonej operacji na dyskietce? Wyjaśnienie tego procesu będzie dotyczyło DOS-u 2.5 firmy Atari Corporation. Część szczegółów dotyczących organizacji katalogu dysku (DIRECTORY), organizacji mapy dyskietki (VTOC-u), znaczeniu sektorów bootowych została wyjaśniona w drugim odcinku niniejszego cyklu, dlatego chcąc uniknąć powtarzania pewnych informacji, odsyłam zainteresowanych do powtórnego przeczytania tego artykułu. Nie będę zajmował się wyjaśnieniem operacji wgrania i nagrania sektora, załóżmy że są to operacje pierwotne. Pod pojęciem operacji pierwotnej należy rozumieć, że dla użytkownika nie ma ona więcej elementów składowych.

   1. Operacja formatowania. Zwykle jest to wywołanie procedury formatującej przy pomocy polecenia: FORMAT. Jest to operacja przystosowująca daną dyskietkę do współpracy ze stacją dysków. Jeżeli dyskietka jest nowo zakupiona i nie zawiera żadnych plików, to zwykle jest ona niezdolna do współpracy ze stacją dysków (jest pokryta nienamagnesowaną warstwą magnetyczną). Dlatego też na wstępie jej użytkowania formatujemy ją. Proces ten polega na wysłaniu odpowiedniego kodu sterującego, który zostanie zinterpretowany przez specjalny układ formatujący wbudowany do stacji dysków. W zależności od wartości tego kodu dyskietka jest formatowana w różnej gęstości. Jak zostało to dokładnie opisane w drugim odcinku cyklu poświęconego odkrywaniu tajemnic Dyskowych Systemów Operacyjnych, na dyskietce pojawią się ścieżki złożone ze sektorów. Nie będę wgłębiał się co dokładnie dzieje się w tym czasie, załóżmy, że jest to słodka tajemnica formatera. Po poprawnym zakończeniu tej operacji program obsługujący komendę FORMAT (zwykle DOS) nagrywa pierwsze trzy sektory, które są traktowane jako sektory bootowe. Zajmuje następnie sektor 360 ($168), którego zawartość będzie traktowana przez Dyskowy System Operacyjny jako informacje o dysku (dla gęstości rozszerzonej również zajmuje sektor 1024 ($400)). Jest to VTOC. Na końcu program formatujący rezerwuje osiem sektorów od 361 do 368 ($169-$170) na spis plików znajdujących się na dysku (DIRECTORY). We VTOC-u uaktywnia odpowiednie bity odpowiedzialne za te sektory, dzięki czemu są one od tej chwili traktowane jako zajęte, zmniejsza również ilość wolnych sektorów, dla gęstości rozszerzonej liczba ta wynosi 1010 (po napisaniu DIR zwykle ukazuje się 999+FREE SECTORS). Jeżeli wszystkie te czynności zakończą się pomyślnie, to operację formatowania można uważać za zakończoną sukcesem. Jeżeli któraś z tych operacji nie powiedzie się, wtedy proces formatowania dyskietki rozpoczyna się od początku i jest powtarzany kilkakrotnie lub aż do poprawnego zakończenia.

   Oto krótka uwaga dotycząca poprawności nazwy pliku. Po uaktywnieniu jakiejkolwiek operacji na dysku (w szczególności: operacji wyrywania i nagrywania pliku, operacji kasowania i zmiany nazwy pliku), która wymaga przesłania nazwy pliku jako parametru, sprawdzana jest poprawność jej budowy. Dzieje się to według następujących zasad: numer stacji dysków musi zawierać się między wartościami: 1-8 (może być pominięty-domyślnie przyjmowany jest wtedy jako równy jeden), większość DOS-ów wymaga, aby pierwszy znak nazwy był literą lub znakiem specjalnym ("*" lub "?" czyli ang. wildcards), kolejne znaki mogą być literami, cyframi, znakami specjalnymi. Długość podstawowej nazwy pliku nie może przekroczyć ośmiu znaków, po znaku "." może nastąpić rozszerzenie nazwy o długości maksymalnie trzech znaków o takiej strukturze jak nazwa podstawowa (bez konieczności używania jako znaku pierwszego liter). Znak "?" zastępuje dowolny znak w nazwie, natomiast znak "*" oznacza ciąg pytąjników od miejsca postawienia * do końca pola. Przykładowo podanie nazwy: FIL*.?XT oznacza plik, krórego nazwa rozpoczyna się na FIL, pozostałe znaki nazwy pola podstawowego są dowolne oraz rozszerzenie rozpoczyna się od dowolnego znaku i kończy na XT.

   2. Operacja wgrania pliku. Zwykle jest to wywołanie procedury wgrywania pliku z parametrem typu: Dn:FILENAME.EXT, gdzie n jest numerem stacji dysków, natomiast FILENAME.EXT jest nazwą pliku, który chcemy wgrać do pamięci komputera. Pierwszą czynnością jaką Dyskowy System Operacyjny wykonuje podczas operacji czytania pliku jest sprawdzenie, czy jest on aktualnie aktywny na dysku. Jeżeli tak, pobierany jest z katalogu dyskowego numer pierwszego sektora zajmowanego przez ten plik, a następnie sektor ten jest wczytywany. Odczytywana jest informacja dotycząca ilości aktywnych bajtów w sektorze. Informację tę zawiera ostatni bajt sektora (w zależności od gęstości sformatowania dyskietki jest to 127 ($7f) lub 255 ($ff) bajt sektora). Po wysłaniu do pamięci komputera wszystkich aktywnych bajtów sektora jest czytany kolejny sektor tego pliku. Dzieje się to na podstawie informacji zawartej w 125 i 126 ($7d i $7e) lub 253 i 254 ($8d i $8e) bajcie sektora. Sposób zakodowania tej informacji jest opisany dokładnie w drugim odcinku opisu Dyskowych Systemów Operacyjnych. Może się zdarzyć sytuacja, że powiązanie sektora z następnym w pliku jest błędne. Dzieje się tak zwykle w wyniku ingerowania w zawartość sektorów pseudofachowoów w dziedzinie operacji na dysku, nieprawidłowego działania Dyskowego Systemu Operacyjnego, buszowania po dyskietce złośliwych wirusów. W takiej sytuacji najczęściej nie zgadza się numer wczytywanego pliku. Jeżeli chcemy wczytać do pamięci komputera cały plik, to operacja czytania kolejnych sektorów pliku jest kontynuowana aż do chwili, gdy numer kolejnego sektora będzie wynosił zero. Jest to znak końca pliku (End Of File). Specyficznym wczytywaniem pliku jest odczyt katalogu dyskowego, jednak jest to tak różna operacja, że zostanie omówiona w oddzielnym punkcie.

   3. Operacja odczytu katalogu dyskowego. Zwykle jest to wywołanie procedury odczytu (DIR)ECTORY z parametrem typu: Dn:FILENAME.EXT, gdzie n jest numerem stacji dysków, natomiast FILENAME.EXT jest nazwą pliku, którego obecność chcemy sprawdzić na dyskietce. Wydanie komendy DIR bez podania parametru spowoduje podanie informacji o wszystkich obecnych na dyskietce plikach (aktywnych). Po wykonaniu polecenia DIR zwykle na ekranie monitora ukazuje się spis aktywnych plików wraz z ich długościami podanymi w sektorach oraz ilość wszystkich wolnych sektorów na dyskietce. Są to jednak informacje w specjalny sposób spreparowane przez Dyskowy System Operacyjny, oto opis w jaki sposób się to dzieje. Otóż jest na wstępie czytany VTOC oraz pierwszy sektor katalogu dyskowego (o numerze 361 ($169)). DOS następnie sprawdza status pliku, jeżeli nie jest on równy 66 ($42) (lub 98 ($62) dla plików zabezpieczonych przed zapisem ((Ile protected)) to procedura przeszukująca katalog przechodzi do następnego pola, bo ten plik jest nieaktywny. Jeżeli dany plik jest aktywny to sprawdzana jest jego nazwa. Jeżeli nazwa pokrywa się z żądaną to jest ona wysyłana wraz z długością, która jest zapisana w drugim i trzecim bajcie poła informacji o pliku. Ponieważ informacja ta jest zapisana w postaci dwóch bajtów, więc specjalna procedura zamienia je na liczby dziesiętne. Proces ten powtarza się aż do chwili, gdy zostaną wysłane wszystkie nazwy z katalogu dyskowego (zgadzające się z nazwą podaną przez użytkownika). Wtedy jest wysyłana informacja dotycząca ilości wolnych sektorów na dyskietce.

   4. Operacja nagrywania pliku. Zwykle jest to wywołanie procedury nagrywania pliku z parametrem typu: Dn:FILENAME.EXT, gdzie n jest numerem stacji dysków, natomiast FILENAME.EXT jest nazwą pliku, który chcemy zapamiętać na nośniku zewnętrznym czyli na dysku.

   Pierwszą czynnością Dyskowego Systemu Operacyjnego w przypadku wykonania procedury nagrania pliku na dyskietce jest sprawdzenie czy plik o podanej nazwie już istnieje. Jeżeli tak, to DOS przechodzi do wykonania czynności, które zawiera operacja kasowania pliku. Po poprawnym jej zakończeniu przechodzi do wykonywania czynności, które są realizowane w przypadku, gdyby plik o takiej samej nazwie nie istniał. Znajduje mianowicie w katalogu dysku (DIRECTORY) pierwsze wolne pole i zapamiętuje tam nazwę, ustawia jednocześnie status pliku jako otwarty do zapisu ($43). Dzięki temu, w obwili gdy operacja nagrywania zostanie brutalnie przerwana, np. przez naciśnięcie klawisza RESET lub poprzez wyłączenie napięcia zasilającego, plik ten jest traktowany jako nieistniejący. Następnie znajduje pierwszy wolny sektor na dyskietce za pomocą informacji zawartych we VTOC-u. Jeżeli katalog dysku lub dysk jest wypełniony w całości to DOS zwróci odpowiedni numer błędu. Jeżeli wszysko jednak zakończyło się pozytywnie to nagrywa pierwszy sektor pliku, którego numer zapamiętuje w odpowiednim polu katalogu dyskowego. Poszukuje następnie kolejnego wolnego sektora, którego numer w specyficzny sposób koduje i zapamiętuje w sektorze bieżącym. Sposób zakodowania tej informacji jest opisany dokładnie w drugim odcinku opisu Dyskowych Systemów Operacyjnych. Dzięki wykonaniu tej operacji jest nawiązana ciągłość pliku (jest to tzw. link). Numer nagranego sektora jest odpowiednio interpretowany i we VTOC-u zostaje zapamiętana informacja o ząjętości tego sektora, ilość wolnych sektorów jest zmniejszana o jeden, długość pliku wyrażona w sektorach jest zwiększana o jeden. Proces nagrywania sektora, poszukiwania następnego wolnego i zmieniania odpowiednich informacji powtarza się do chwili, gdy plik w całości zostanie nagrany lub dysk będzie pełny. Jeżeli plik został nagrany, numer kolejnego sektora zostanie wtedy zakodowany jako zero, co oznacza koniec pliku. Następnie Dyskowy System Operacyjny zapamiętuje VTOC, zapamiętuje długość pliku, zmienia jego status na $42 czyli oznaczający, że plik jest aktywny, na końcu nagrywa katalog dysku. Isnieje jeszcze specyficzny sposób nagrywania, a konkretnie dołączania pliku na końcu już istniejącego. Jest to tzw. appendowanie. Ten sposób nagrywania polega na znalezieniu odpowiedniego pliku, jeżeli jest on na dyskietce, to wykonywana jest standardowa procedura nagrywania, ale bez zapamiętania nazwy tego pliku w katalogu dyskowym (bo taki plik już istnieje). Po nagraniu pliku dołączanego DOS szuka końca pliku, do którego są dołączane dane (wgrywany jest każdy sektor tego pliku, aż do chwili, gdy numer kolejnego sektora będzie równy zero (EOF - End Of File)). Zmieniany jest on wtedy na numer pierwszego sektora pliku przed chwilą nagranego, do starej długości pliku dodawana jest długość nagranego pliku.

   5. Operacja kasowania pliku. Zwykle jest to wywołanie procedury kasowania pliku (komenda DELETE lub ERASE) z podaniem parametru, jak w przypadku odczytu pliku dyskowego (patrz punkt 3). Na wstępie odczytywany jest pierwszy sektor katalogu dyskowego, a następnie wykonywana jest procedura poszukiwania żądanego pliku. Jeżeli w całym katalogu dyskowym nie ma żadnego pliku o danej nazwie to Dyskowy System Operacyjny niezwłocznie poinformuje nas o tym fakcie. Jeżeli na dyskietce istnieje jednak chociaż jeden plik o danej nazwie to wczytywany jest VTOC. Następne posunięcia DOS-u można traktować jako operację czytania pliku, ale z drobnymi różnicami. Polegają one na tym, że zawartość sektora nie jest przesyłana do pamięci komputera (pozostaje w buforze) oraz każdy numer sektora jest analizowany i zapisywany we VTOC-u jako wolny. Po wczytaniu każdego sektora zwiększana jest o jeden ilość wolnych sektorów. Po zakończeniu operacji "czytania pliku" zmieniany jest status pliku na skasowany (128 ($80)) oraz nagrywany jest VTOC i DIRECTORY. Po poprawnym zakończeniu tych wszystkich operacji plik uważany jest przez Dyskowy System Operacyjny oraz przez inne programy operujące na plikach dyskowych (np. Loadery) za skasowany i nieistniejący.

6. Operacja zmiany nazwy pliku. Zwykle jest to wywołanie procedury zmiany nazwy pliku z podaniem parametru typu: Dn:FILENAME.OLD,FILENAME.NEW, gdzie FILENAME.OLD jest starą nazwą pliku, natomiast FILENAME.NEW jest nazwą nową. Operacja RENAME czyli operacja zmiany nazwy dokonywana jest wyłącznie przy użyciu sektorów zawierających katalog dysku. Jest to operacja do złudzenia przypominająca operację odczytu DIRECTORY pliku z tą drobną różnicą, że aktualna nazwa pliku jest zmieniana na nową, żądaną. Więc przeszukiwany jest cały katalog dysku w sposób analogiczny jak w przypadku odczytu DIRECTORY dyskietki (sprawdzanie statusu pliku, sprawdzanie istnienia na dyskietce pliku o starej nazwie). Jeżeli taki plik istnieje to poszukiwany jest plik o nazwie nowej, w chwili gdy zostanie on zlokalizowany DOS powinien niezwłocznie nas poinformować o wystąpieniu błędu (DOS 2.5, na którym oparty jest niniejszy opis wykazuje własną inwencję twórczą nagrywając dwa pliki o tej samej nazwie). Postępowanie takie nie jest pozbawione sensu, ma uchronić dyskietkę przed sytuacją, gdy znajdą się na niej dwa pliki o tej samej nazwie. Stara nazwa jest zmieniana na nową tylko wtedy, gdy jest ona unikalna. Po zmienieniu wszystkich starych nazw na nowe katalog dyskietki jest nagrywany i wtedy operację zmiany nazwy pliku można uznać za zakończoną.

   Tak najogólniej ujmując wyglądają operacje na dysku wykonywane przez Dyskowy System Operacyjny. Kolejny odcinek cyklu poświęconego odkrywaniu tajemnic DOS-u będzie poświęcony wyjaśnieniu pojęcia i struktury pliku oraz charakterystyce porównawczej kilku bardziej rozpowszechnionych DOS-ów wraz z ich Command Processorami.

Leon



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001