System przerwań na podstawie DOS Autorzy Łukasz Długoszewski Jacek Olszyński
Definicja przerwania: Mechanizmy wewnętrzne, z których system operacyjny korzysta przy realizacji poleceń operatorskich są również udostępniane programom użytkowym. Dostęp do tych mechanizmów API (Application Program Interface) odbywa się przy pomocy systemu przerwań mikroprocesora. Inaczej mówiąc przerwaniem nazywamy zgłaszane procesorowi zapotrzebowania na skorzystanie z jego zasobów. Zapotrzebowania takie zgłaszają np. urządzenia I/O, system operacyjny, BIOS. Priorytety udostępniania tych zasobów, czyli ich hierarchia ważności są określane przez numery przerwań. Aby to zrozumieć opiszmy pojęcie tablicy wektorów przerwań.
Tablica wektorów przerwań: Dla procesorów z rodziny 8086 informacje o przerwaniach zawarte są w obszarze pamięci zwanym właśnie tablicą wektorów przerwań. Tablica ta przechowuje 256 adresów (od 0 do 255) procedur obsługi przerwań. Adresy procedur są 32-bitowe. Składają się z dwóch słów: segmentu i offsetu. Jak łatwo obliczyć, zajmują więc 1024 bajty i są umiejscowione w początkowym obszarze pamięci, począwszy od adresu 0000:0000H. Procedury obsługi przerwań mogą być natomiast umieszczone w dowolnym segmencie pamięci. Wśród zadeklarowanych 256 przerwań istnieją przerwania nie używane, które dają możliwość zdefiniowania nowych procedur obsługi. Nie można przedefiniowywać istniejących już przerwań.
Należy zauważyć ważną właściwość mikroprocesora: może on obsłużyć w danej chwili tylko jedno przerwanie. Biorąc to pod uwagę należy zdefiniować priorytety obsługi przerwań: hierarchię ważności ich przyjmowania. Oczywistym jest przecież, że krytyczne przerwanie zgłaszane przez system operacyjny powinno być rozpatrzone przed przerwaniem zgłaszanym przez mniej ważną aplikację działającą w tle. Na liście rozkazów przerwania definiowane są instrukcją int #h (interrupt) Jest to instrukcja której jedyny argument określa numer przerwania. Numer przerwania określa jednocześnie jego priorytet. Przerwanie o numerze 00h posiada zatem najwyższy priorytet.
Przerwania a system DOS System operacyjny DOS udostępnia swoje mechanizmy programiście (programowi użytkowemu) za pośrednictwem przerwań z grupy 20H-3FH. Stosując konsekwentnie te mechanizmy programista osiąga istotne korzyści: Program staje się niezależny od sprzętu (powinien działać poprawnie na dowolnym komputerze wyposażonym w system DOS) Nie jest konieczne wnikanie w szczegóły konstrukcyjne mikrokomputera – tworzenie programu jest więc łatwiejsze i mniejsze jest prawdopodobieństwo popełnienia trudnych do wykrycia błędów.
Umowny podział: Usługi świadczone przez DOS na rzecz programu użytkowego są często umownie zaliczane do dwóch grup, określanych jako: funkcje systemu przerwania systemowe. Nazewnictwo to wynika z realizacji dostępu do mechanizmów systemu DOS. Większość procedur systemowych zawarto w programie obsługi przerwania 21H i te procedury są nazwane funkcjami systemu DOS. Pozostałe przerwania z grupy 20H-3FH są nazwane przerwaniami systemowymi.
Twórcy systemu DOS zalecają korzystanie, o ile jest to możliwe, z funkcji systemu, a nie z przerwań systemowych. W tym kierunku zmierza też ewolucja systemu. Ponieważ duża liczba różnorodnych mechanizmów systemowych nie pozwala na „rozsądne” rozdzielanie ich między nieliczne przerwania, zdecydowano się na rozbudowanie jednego z przerwań: 21H Mieści ono w sobie wiele użytecznych dla użytkownika funkcji, wybranie którejś z nich odbywa się przez podanie odpowiedniego parametru przy wywołaniu tego przerwania. DOS rezerwuje pozostałe przerwania dla nietypowych (specjalnych) usług lub do użytku wewnętrznego systemu.
Inna klasyfikacja przerwań: Przerwania, a w związku z tym również procedury ich obsługi mogą być dwojakiego rodzaju: Przerwania zgłaszane przez układy zewnętrzne w przypadkowych chwilach, asynchroniczne w stosunku do aktualnie wykonywanego programu. Procedura obsługi takiego przerwania powinna wykonywać się w tle, nie powodując zmiany zawartości rejestrów procesora. Przerwania programowe, zgłaszane przez aktualnie wykonywany program w celu uzyskania pewnych usług od procedury obsługi np. systemu operacyjnego. W tym przypadku do i z procedury obsługi są przekazywane parametry przez rejestry procesora.
Procedura obsługi przerwań: Ideę obsługi przerwania (interrupt handling) możemy zdefiniować jako ciąg czynności powodowanych przez przerwanie. Jeśli nie obowiązuje maskowanie przerwań, to wskutek wystąpienia przerwania następuje zapamiętanie na stosie stanu bieżącego procesu, wykonanie procedury obsługi przerwania (jej adres pobiera się z wektora przerwań), po czym (jeśli nie wystąpił błąd), stan przerwanego procesu zostaje odtworzony w procesorze i proces zostaje podjęty od miejsca, w którym go przerwano. Wystąpienie przerwania priorytetowego podczas obsługi przerwania powoduje zapamiętanie w analogiczny sposób stanu procesu obsługi przerwania i obsłużenie pilniejszego przerwania. Obsługa przerwania powinna przebiegać możliwie szybko.
Przerwania maskowane i niemaskowane Na poprzednim slajdzie pojawiło się pojęcie maskowania przerwań. Wprowadźmy więc podział: - Przerwania NMI (Non Maskable Interrupts) – gdy rozpocznie się obsługa takiego przerwania, nie może zostać ona przerwana. Zwykle przerwaniami tego typu są przerwania krytyczne. - Przerwania MI (Maskable Interrupts) – obsługa takiego przerwania może zostać przerwana przed zakończeniem
Opis kilku wybranych funkcji przerwania 21H: Jako przykładem posłużymy się kilkoma funkcjami służącymi do obsługi plików, katalogów i dysków. Podstawowymi pojęciami związanymi z obsługą plików są identyfikatory i wskaźniki plików. W przypadku omawianych tu funkcji DOS-u, w trakcie realizacji operacji na plikach, nie potrzeba każdorazowo podawać nazwy pliku i jego położenia. Zamiast tego plik, z którym współpracuje pogram określamy poprzez wskazanie symbolu tego pliku. Symbol ten, nazywany identyfikatorem pliku (ang. file handle) ma postać liczby 16 bitowej. Identyfikator pliku używany jest w większości rutynowej operacji zarządzania plikami.
Funkcja 42H używana jest do zmiany położenia wskaźnika pliku w operacjach odczytu i zapisu. W celu przywołania tej funkcji w rejestrze BX należy umieścić identyfikator pliku. Nowe położenie wskaźnika określa 32-bitowa liczba całkowita zawarta w rejestrach CX (część starsza) i DX (część młodsza). Funkcja 3CH tworzy nowy plik. Jeśli plik o podanej nazwie istnieje , to jest otwierany, przy czym dotychczasowa zawartość ulega zniszczeniu. Początkowa długość pliku wynosi zawsze 0. Funkcja 5BH używana jest do tworzenia plików. W odróżnieniu od poprzedniej funkcji , funkcja ta utworzy plik tylko wówczas, jeśli plik ten dotychczas nie istniał. Funkcja 39H tworzy podkatalog (ang. subdirectory). Funkcja 3BH dokonuje zmiany bieżącego katalogu. Funkcja 19H wypisuje do rejestru AL kod bieżącego napędu dyskowego: 0 – napęd A, 1-napęd B
Przeanalizujmy sposób korzystania z przerwań 25H(i 26H) służących do odczytywania (i zapisywania ) sektorów na dysku logicznym. Przerwania te nie realizują dostępu do sektorów znajdujących się poza dyskami logicznymi na dysku twardym np. głównego rekordu ładującego i sektorów zawierających tablice stref rozszerzenia. Przerwania 25H i 26H są godne uwagi co najmniej z dwóch powodów: Nietypowo korzystają ze stosu i rejestrów(nieuwzględnienie tego faktu może być przyczyną złego działania programu). Ograniczenie wielkości numeru sektora (16- bitowa liczba całkowita przekazywana w rejestrze DX) w tych przerwaniach w wersjach systemu do 3.30 jest równoznaczne z ograniczeniem pojemności dysku logicznego do 32MB.
Korzystanie z przerwań na poziomie asemblera Przed zgłoszeniem przerwania należy w rejestrach procesora przekazać następujące parametry: AL- numer dysku logicznego (0=A, 1=B, itd..) CX- liczba sektorów do odczytania (zapisania) DX- numer logiczny początkowego sektora DS::BX- wskaźnik do bufora biorącego udział w operacji Przerwania 25H i 26H sygnalizują błąd przez ustawienie znacznika przeniesienia CF. Orginalna zawartość rejestrów znaczników jest pozostawiona na stosie . Rodzaj błędu, przy CF=1, jest sygnalizowany w rejestrze AX. Należy pamiętać, że procedury obsługi wymienionych przerwań gwarantują jedynie zachowanie wartości rejestrów segmentowych.
Na przykład odczytanie sektora za pomocą przerwania 25h należy w języku asemblera zaprogramować następująco: MOV CX, 1 MOV DX,5 MOV BX, OFFSET BUFOR INT 25H JC BLAD POPF
Dziekujemy