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:

AdresOpis
320Hselekcja 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
322Hdodatkowy rejestr sterujący (rozszerzenie)
323Hustawienie DRQ dla DMA
324Hsygnał ECC
325Hrejestr konfiguracji
326Hsygnał DRIVE SELECT (wybór napędu) i WRITE GATE (zezwolenie zapisu)
327Hport zarezerwowany
328Hbufor 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
32AHliczba sektorów
32BHnumer sektora
32CHnumer cylindra (LOW). Zapisany jest w niej i w 32DH numer cylindra (0-1023)
32DHnumer 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

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ę:

AdresOpis
1BEH-1CDHparametry pierwszej partycji
1CEH-1DDHparametry drugiej partycji
1DEH-1EDHparametry trzeciej partycji
1EEH-1FDHparametry czwartej partycji
1FEH-1FFHznacznik końca partycji

Każda partycja opisana jest blokiem 16 bajtów, struktura bloku jest następująca:

AdresOpis
0Haktywność partycji
=0H - nieaktywna
=80H - aktywna (zawiera system operacyjny)
1Hnumer głowicy początku partycji
2H-3Hpoczątkowy numer cylindra i sektora danej partycji
Bity 1..5, bajta 2H - numer sektora
Bity 6..7, bajta 2H i bajt 3H - numer cylindra
4Hokreś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
5Hkońcowy numer głowicy danej partycji
6H-7Hkońcowy numer cylindra i sektora
Bity 1..5, bajta 6H - numer sektora
Bity 6..7, bajta 6H i bajt 7H - numer cylindra
8H-0BHokreślają numer pierwszego sektora partycji
0CH-0FHliczba 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:

AdresOpis
00H-02Hinstrukcja skoku do początku programu
03H-0AHnazwa wersji systemu
0BH-OCHwielkość sektorów (w bajtach)
0DHrozmiar jednostki alokacji
0EH-0FHliczba sektorów zarezerwowanych
10Hliczba kopii tablicy FAT
11H-12Hmaksymalna liczba plików w katalogu głównym
13H-14Hcałkowita liczba sektorów na dysku
15Hidentyfikator nośnika
16H-17Hliczba sektorów zajętych tablicą FAT
18H-19Hliczba sektorów na ścieżce
1AH-1BHliczba głowic na dysku twardym
1CH-1FHliczba ukrytych sektorów
20H-23Hcałkowita liczba sektorów na dysku
24Hnumer identyfikacyjny mechanizmu dyskowego
25Hbajt zarezerwowany
26Hznacznik (29H)
27H-2AHnumer seryjny dysku
2BH-35Hetykieta
36H-3DHbajty 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 0identyfikator formatu
pozycja 1nie wykorzystana
pozycja 2status bloku 2
pozycja 3status bloku 3
pozycja 4status 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:

000Hblok wolny
002H..FF0Hblok zajęty
FF8H..FFFHzajęty ostatni blok zbioru
FF1H..FF7Hblok 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.

PoleOpis
1Nazwa 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
2Rozszerzenie nazwy zbioru (3 bajty)
3Atrybut (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
4Zarezerwowane (10 bajtów)
5Czas utworzenia zbioru (2 bajty)
Bity 15-11: godzina (0-23)
Bity 10-5: minuty (0-59)
Bity 4-0: sekundy (w odstępach dwusekundowych)
6Data 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
7Numer pozycji zbioru w tablicy FAT (2 bajty)
8Długość zbioru (4 bajty)

Autor: Karol Wierzchołowski, opracowano: 12.01.2002 r. Wszelkie prawa zastrzeżone.
Kontakt

Jeśli chcesz się z nami skontaktować napisz na adres: info(at)binboy.org lub odwiedź nasz profil na Facebooku!

O Nas

Serwis binboy.org to kopalnia wiedzy dla wszystkich z branży IT, w szczególności dla programistów i webmasterów. To duży zbiór kursów programowania, tutoriali, darmowych ebooków, setki kodów źródłowych itp.

Bądź w kontakcie

Panel użytkownika

Zaloguj się do panelu użytkownika.
Nie masz konta? Zarejestruj się!
Zapomniałeś hasła?