DOS można uważać za bibliotekę służącą do pobierania plików/katalogów na komputer (i trochę więcej). int 21h
to prosta "sztuczka" sprzętowa, która ułatwia wywoływanie kodu z tej biblioteki bez uprzedniego poinformowania, gdzie będzie umieszczona w pamięci. Alternatywnie możesz to potraktować jako sposób na wykorzystanie interfejsu API DOS.
Obecnie temat przerwań programowych jest złożony, częściowo dlatego, że pojęcia ewoluowały wraz z upływem czasu, gdy Intel dodał funkcje do rodziny x86, starając się zachować kompatybilność ze starym oprogramowaniem. Właściwe wyjaśnienie zajmie kilka stron, ale spróbuję krótko.
Głównym pytaniem jest, czy jesteś w trybie rzeczywistym w trybie rzeczywistym lub tryb chroniony.
Tryb rzeczywisty to prosty, "oryginalny" tryb pracy procesora x86. Jest to tryb, w którym działa DOS (podczas uruchamiania programów DOS w systemie Windows wirtualny procesor trybu jest zwirtualizowany, więc w jego ramach obowiązują te same zasady). Aktualnie uruchomiony program ma pełną kontrolę nad procesorem.
W trybie rzeczywistym istnieje tabela wektorowa, która informuje procesor, do którego adresu przejść, dla każdego przerwania od 0 do 255. Ta tabela jest zapełniana przez BIOS i DOS, a także sterowniki urządzeń, a czasami programy z specjalne potrzeby. Niektóre z tych przerw mogą być generowane przez sprzęt (na przykład przez naciśnięcie klawisza). Inne są generowane przez pewne warunki oprogramowania (na przykład dzielenie przez 0). Dowolny z nich może być wygenerowany za pomocą instrukcji .
Programy mogą ustawiać/kasować flagę "enable interrupts"; ta flaga wpływa tylko na przerwania sprzętowe i nie ma wpływu na instrukcje int
.
Projektanci DOS zdecydowali się użyć przerwania numerycznego 21h do obsługi żądań DOS - numer nie ma większego znaczenia: był to tylko nieużywany wpis w tym czasie. Istnieje wiele innych (na przykład 10h to procedura przerwania zainstalowana w BIOS-ie, która zajmuje się na przykład grafiką). Należy również pamiętać, że wszystko to dotyczy tylko kompatybilnych komputerów IBM. Procesory x86, na przykład systemy wbudowane, mogą mieć swoje oprogramowanie i tabele przerwań ułożone zupełnie inaczej!
Tryb chroniony to złożony tryb "bezpieczeństwa", który został wprowadzony w procesorze 286 i znacznie rozszerzony na 386. Zapewnia wiele poziomów uprawnień. System operacyjny musi to wszystko skonfigurować (a jeśli system operacyjny robi to źle, masz potencjalny exploit bezpieczeństwa). Programy użytkownika są zwykle ograniczone do trybu "minimalnego przywileju", gdzie próba uzyskania dostępu do portów sprzętowych, zmiana flagi przerwania lub uzyskanie dostępu do określonych regionów pamięci, zatrzymuje program i pozwala systemowi operacyjnemu zdecydować, co zrobić (czy to zakończyć program lub dać programowi to, co wydaje się chcieć).
Obsługa przerwań jest bardziej skomplikowana. Wystarczy powiedzieć, że ogólnie, jeśli program użytkownika wykonuje przerwanie programowe, numer przerwania jest , a nie używany jako wektor w tabeli przerwań. Generowany jest raczej ogólny wyjątek ochrony, a program obsługi systemu operacyjnego dla wspomnianego wyjątku może (jeśli system operacyjny jest zaprojektowany w ten sposób) sprawdzić, czego proces wymaga i obsłużyć żądanie. Jestem prawie pewien, że Linux i Windows miały w przeszłości (jeśli nie są obecnie) używane tego rodzaju mechanizm dla ich wywołań systemowych. Są jednak inne sposoby osiągnięcia tego, na przykład instrukcja SYSENTER.
Drugi post, z którym się łączysz, nie ma wiele wspólnego z INT 21h - nie jest to coś, z czym możesz się natknąć, chyba że masz do czynienia z 16-bitowym kodem DOS. Inne systemy operacyjne również używają przerwania dla wywołań systemowych, chociaż nie 21h - a nie-pradawne procesory OS + używają nowszej instrukcji SYSCALL. – snemarch