Kurs programowania w asemblerze
Organizacja dysku
Dysk twardy w przestrzeni adresowej procesora zajmuję adresy od 320H do 32FH. Znaczenie poszczególnych portów jest następujące:
| Adres | Opis |
|---|---|
| 320H | selekcja bufora |
| 321H | rejestr sterujący Bit 0: wybór głowicy 2^0 Bit 1: wybór głowicy 2^1 Bit 2: wybór głowicy 2^2 Bit 3: wybór napędu 0 Bit 4: wybór napędu 1 Bit 5: reset licznika bufora Bit 6: koniec zapisu lub odczytu (bufor gotowy) Bit 7: przerwanie INT, sygnał DRQ dla DMA |
| 322H | dodatkowy rejestr sterujący (rozszerzenie) |
| 323H | ustawienie DRQ dla DMA |
| 324H | sygnał ECC |
| 325H | rejestr konfiguracji |
| 326H | sygnał DRIVE SELECT (wybór napędu) i WRITE GATE (zezwolenie zapisu) |
| 327H | port zarezerwowany |
| 328H | bufor trójstanowy |
| 329H | rejestr błędów Bit 0: znacznik danych (ang. data marker) Bit 1: niewykonalny rozkaz RESTORE Bit 2: przerwanie rozkazu Bit 4: błąd CRC pola ID Bit 6: błąd CRC pola danych Bit 7: uszkodzony sektor |
| 32AH | liczba sektorów |
| 32BH | numer sektora |
| 32CH | numer cylindra (LOW). Zapisany jest w niej i w 32DH numer cylindra (0-1023) |
| 32DH | numer cylindra (HIGH). Wykorzystywane są tylko dwa najmłodsze bity. |
| 32EH | wybór rozmiaru sektora, numer napędu, numer głowicy: Bity 2..0 - wybór głowicy =000 - głowica 0 =001 - głowica 1 =010 - głowica 2 =011 - głowica 3 =100 - głowica 4 =101 - głowica 5 =110 - głowica 6 =111 - głowica 7 Bity 4 i 3 - wybór napędu =00 - napęd 0 =01 - napęd 1 =10 - napęd 2 =11 - napęd 3 Bity 5 i 6 - rozmiar sektora =00 - 256-bajtowy =01 - 512-bajtowy =10 - 1024-bajtowy =11 - 128-bajtowy Bit 7 - kontrola CRC |
| 32FH | rejestr statusu rozkazów Bit 0: błąd (b0=1) Bit 1: nie zakończony rozkaz (b1=1) Bit 3: sygnał dla DMA i IRQ (b3=1) Bit 4: ustalona pozycja głowicy (b4=1) Bit 5: błąd zapisu (b5=1) Bit 6: gotowość (ang. READY) =0 - napęd niegotowy =1 - napęd gotowy Bit 7 - napęd zajęty (an. BUSY) =0 - HDC wolny =1 - HDC zajęty |
Każdy dysk twardy lub miękki składa się z cylindrów, ścieżek oraz sektorów. Sektor jest najmniejszym blokiem danych, który można za jednym razem odczytać. Dyski twarde mogą być dodatkowo podzielona logicznie na partycje, które tworzy się przed formatowaniem. Właśnie dzięki partycjom można mieć zainstalowanych kilka systemów operacyjnych.. Podczas formatowania w sektorach początkowych dysku (partycji) zapisywane są następujące informacje:
- Rekord ładujący
- Tablica rozmieszczeń plików FAT
- Kopia(e) tablicy FAT
- Katalog główny
Rekord ładujący
Rekord ładujący zapisany jest w pierwszym sektorze dysku (głowica 0 i cylinder 0). Przy dyskach twardych program zawarty w tym sektorze ma za zadanie odszukać aktywną partycję (tą, na której zapisany jest system operacyjny). Za tym krótkim programem znajduje się tablica opisu wszystkich partycji. W systemie DOS 3.30 można było mieć cztery partycje. Tablica miała następującą strukturę:
| Adres | Opis |
|---|---|
| 1BEH-1CDH | parametry pierwszej partycji |
| 1CEH-1DDH | parametry drugiej partycji |
| 1DEH-1EDH | parametry trzeciej partycji |
| 1EEH-1FDH | parametry czwartej partycji |
| 1FEH-1FFH | znacznik końca partycji |
Każda partycja opisana jest blokiem 16 bajtów, struktura bloku jest następująca:
| Adres | Opis |
|---|---|
| 0H | aktywność partycji =0H - nieaktywna =80H - aktywna (zawiera system operacyjny) |
| 1H | numer głowicy początku partycji |
| 2H-3H | początkowy numer cylindra i sektora danej partycji Bity 1..5, bajta 2H - numer sektora Bity 6..7, bajta 2H i bajt 3H - numer cylindra |
| 4H | określa typ partycji =0 - partycja nie używana przez DOS =1 - partycja DOS'a z 12-bitową tablicą FAT =4 - partycja DOS'a z 16-bitową tablicą FAT =5 - rozszerzona partycja DOS'a |
| 5H | końcowy numer głowicy danej partycji |
| 6H-7H | końcowy numer cylindra i sektora Bity 1..5, bajta 6H - numer sektora Bity 6..7, bajta 6H i bajt 7H - numer cylindra |
| 8H-0BH | określają numer pierwszego sektora partycji |
| 0CH-0FH | liczba sektorów partycji |
Jeśli tablica jest typu rozszerzonego, zachowuje się jak odrębny dysk i posiada własną tablicę partycji.
Po uruchomieniu komputera (lub jego restarcie) program zawarty w BIOS'ie odczytuje pierwszy sektor dysku A: (chyba, że została kolejność zmieniona w ustawieniach w BIOS'ie), jeśli wystąpi błąd (np. nie ma dyskietki w stacji dysków), wczytuje pierwszy sektor dysku twardego. Znajduje tam rekord ładujący. Odczytany sektor zapisywany zostaje w pamięci operacyjnej pod adresem 0:7C00H. Ostatnie dwa bajty zapisane pod tym adresem powinny mieć (jeśli nie wystąpił błąd) wartość 0AA55H. Dzięki tym bajtom DOS sprawdza poprawność rekordu ładującego. W pierwszym sektorze dysku znajduje się również blok parametrów BIOS (BPB). Struktura bloku jest następująca:
| Adres | Opis |
|---|---|
| 00H-02H | instrukcja skoku do początku programu |
| 03H-0AH | nazwa wersji systemu |
| 0BH-OCH | wielkość sektorów (w bajtach) |
| 0DH | rozmiar jednostki alokacji |
| 0EH-0FH | liczba sektorów zarezerwowanych |
| 10H | liczba kopii tablicy FAT |
| 11H-12H | maksymalna liczba plików w katalogu głównym |
| 13H-14H | całkowita liczba sektorów na dysku |
| 15H | identyfikator nośnika |
| 16H-17H | liczba sektorów zajętych tablicą FAT |
| 18H-19H | liczba sektorów na ścieżce |
| 1AH-1BH | liczba głowic na dysku twardym |
| 1CH-1FH | liczba ukrytych sektorów |
| 20H-23H | całkowita liczba sektorów na dysku |
| 24H | numer identyfikacyjny mechanizmu dyskowego |
| 25H | bajt zarezerwowany |
| 26H | znacznik (29H) |
| 27H-2AH | numer seryjny dysku |
| 2BH-35H | etykieta |
| 36H-3DH | bajty zarezerwowane |
Tablica FAT
Tablica rozmieszczeń plików (FAT - File Allocation Table) zawiera informację o sposobie rozmieszczenia na dysku poszczególnych zbiorów użytkownika. Uszkodzenie zawartych tam informacji może doprowadzić do nieodwracalnej utraty wszystkich danych. Z tego względu tworzone są kopie tej tablicy (zazwyczaj jedna w następnych sektorach). Wszystkie pliki zapisane są w sektorach. Jeśli plik nie mieści się w jednym sektorze zostaje podzielony i druga jego część zapisywana jest w innym wolnym sektorze. Jeśli dysk nie był używany po formatowaniu, pliki zapisywane są w kolejnych sektorach, jeśli jednak na dysku były już zapisywane jakieś informacje plik może zostać rozrzucony po całym dysku, co spowolni pracę komputera. W tym wypadku używa się programów defragmentujących dysk, które układają w kolejnych sektorach kolejne części pliku. Może to przyspieszyć pracę naszego komputera.
Struktura tak zapisanych danych zapamiętywana jest właśnie w tablicy FAT. Tablica ta jest spisem rozmieszczenia na dysku poszczególnych bloków. Znaczenie poszczególnych pozycji w tablicy jest następujące:
| pozycja 0 | identyfikator formatu |
| pozycja 1 | nie wykorzystana |
| pozycja 2 | status bloku 2 |
| pozycja 3 | status bloku 3 |
| pozycja 4 | status bloku 4 |
Ponieważ ilość bloków dostępnych na dysku przekracza 256 (8 bitów), dlatego poszczególne pozycje tablicy FAT zapisywane są w 12, 16 lub 32 bitach (ten ostatni wyłącznie dla nowych systemów operacyjnych). W poszczególnych pozycjach FAT zapisany jest tzw. status bloku, który określa czy dany blok jest zajęty, wolny itp. Stany te zostały opisane poniżej:
| 000H | blok wolny |
| 002H..FF0H | blok zajęty |
| FF8H..FFFH | zajęty ostatni blok zbioru |
| FF1H..FF7H | blok jest uszkodzony |
Pozycja 0 w tablicy FAT służy do określenia formatu dysku. Dla dysku twardego zapisana jest tam wartość 0F8H.
Numer pierwszej pozycji FAT danego zbioru podawany jest w katalogu głównym dysku (ang. directory). Jeśli cały plik zmieścił się w jednym bloku, to wskazywana przez katalog pozycja tablicy będzie zawierać kod 0FFFH. Jeśli jednak cały plik nie zmieści się w jednym bloku, to wskazany będzie numer kolejnego sektora. Na końcu jest zapisany kod końca zbioru (wartość od FF8H do FFFH).
Katalog główny
Na dysku twardym lub dyskietce, za tablicą FAT znajduje się standardowo złożony z 64 pozycji katalog główny. Jest on pewnego rodzaju spisem treści. Poszczególne informacje dotyczące zbiorów zapisane są w postaci rekordów. Każdy rekord, więc opisuje jeden zbiór danych. Opis poszczególnych pól został przedstawiony poniżej.
| Pole | Opis |
|---|---|
| 1 | Nazwa zbioru (8 bajtów). Pierwszy bajt nazwy zbioru jest także statusem pola katalogu. Może przyjmować następujące wartości: 00H - pozycja jeszcze nie używana E5H - plik skasowany 2E - podkatalog |
| 2 | Rozszerzenie nazwy zbioru (3 bajty) |
| 3 | Atrybut (1 bajt). Poszczególne bity mają następujące znaczenie: Bit 0: tylko do odczytu Bit 1: ukryty Bit 2: systemowy Bit 3: etykieta dysku Bit 4: podkatalog Bit 5: archiwum |
| 4 | Zarezerwowane (10 bajtów) |
| 5 | Czas utworzenia zbioru (2 bajty) Bity 15-11: godzina (0-23) Bity 10-5: minuty (0-59) Bity 4-0: sekundy (w odstępach dwusekundowych) |
| 6 | Data utworzenia zbioru (2 bajty) Bity 15-9: rok (od 1980, wartości 0..77H) Bity 8-5: miesiąc (1-12) Bity 4-0: dzień tygodnia |
| 7 | Numer pozycji zbioru w tablicy FAT (2 bajty) |
| 8 | Długość zbioru (4 bajty) |
