2009-08-07 8 views
5

Zainspirowany to pytanieCo to jest INT 21h?

How can I force GDB to disassemble?

zastanawiałem o 21h INT jako koncepcji. Teraz mam bardzo zardzewiałą wiedzę o wnętrzach, ale nie tak wiele szczegółów. Pamiętam, że w C64 miałeś regularne Przerwania i Non Maskable Interrupts, ale moja wiedza kończy się tutaj. Czy możesz podać mi jakąś wskazówkę? Czy jest to strategia związana z DOS?

+0

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

Odpowiedz

12

Od here: Wielozadaniowy przerywnik DOS używany do różnych funkcji, w tym odczytywania klawiatury i pisania na konsolę i drukarkę. Był również używany do odczytu i zapisu dysków za pomocą wcześniejszej metody File Control Block (FCB).

3

Instrukcja INT jest przerwaniem programowym. Powoduje skok do rutyny wskazywanej przez wektor przerwań, który jest stałą lokalizacją w pamięci. Zaletą instrukcji INT jest to, że ma tylko 2 bajty, w przeciwieństwie do 6 dla JMP i może być łatwo przekierowana przez modyfikację zawartości wektora przerwań.

1

(Prawie) cały interfejs DOS został udostępniony jako polecenia INT21h, z parametrami w różnych rejestrach. To mała sztuczka, za pomocą wbudowanego w sprzęt stołu, aby przejść do właściwego kodu. Również INT 33h było dla myszy.

7

zawiera wiele informacji na temat tego, co przerwanie robi co. int 21, podobnie jak wszystkie inne, obsługuje szeroki zakres funkcji w zależności od wartości rejestru.

Dostępny jest również non-HTML version of Ralph Brown's list.

2

to od wielkiego The Art of Assembly Language Programming o przerwań:

Na 80x86, istnieją trzy typy zdarzeń powszechnie znanych jako przerwań: pułapki, wyjątków i przerwań (przerwania sprzętowe). Ten rozdział opisuje każdy z tych formularzy i omawia ich obsługę na procesorach 80x86 i komputerach kompatybilnych z PC.

Mimo że terminy "pułapka" i "wyjątek" są często używane jako synonimy, my użyjemy terminu "pułapka", aby wskazać programistę zainicjowanego i oczekiwanego przeniesienia kontroli do specjalnej procedury obsługi. Pod wieloma względami pułapka jest niczym więcej, niż wyspecjalizowanym wywoływaniem podprogramów. Wiele tekstów odnosi się do pułapek jako przerwań oprogramowania. Instrukcja int 80x86 to główny pojazd do wykonywania pułapki. Zauważ, że pułapki są zwykle bezwarunkowe ; to znaczy, kiedy wykonujesz instrukcję int, kontrola zawsze przechodzi do procedury powiązanej z pułapką. Od pułapek wykonać za pomocą wyraźnej instrukcji, łatwo jest określić dokładnie, które instrukcje w programie wywołają procedurę robienia pułapek .

Chapter 17 - Interrupt Structure and Interrupt Service Routines

2

Int 0x21 jest oprogramowanie przerwania x86 - w zasadzie oznacza, że ​​istnieje tabela przerwań w stałym punkcie w pamięci listą adresów funkcji oprogramowania przerwań.Kiedy procesor x86 odbierze kod operacji przerwań (lub w inny sposób zdecyduje, że należy wykonać określone przerwanie programowe), odwołuje się do tej tabeli, aby wykonać wywołanie do tego punktu (funkcja w tym miejscu musi użyć iret zamiast ret, aby powrócić).

Możliwe jest przemapowanie Int 0x21 i innych przerwań oprogramowania (nawet w systemie DOS, chociaż może to mieć negatywne skutki uboczne). Jednym interesującym przerwaniem w oprogramowaniu do mapowania lub łańcucha jest Int 0x1C (lub 0x08 jeśli jesteś ostrożny), co jest przerwaniem systemowym, zwanym 18,2 razy na sekundę. Może to być wykorzystane do tworzenia procesów "w tle", nawet w trybie pojedynczego wątku rzeczywistego (proces trybu rzeczywistego zostanie przerwany 18,2 razy na sekundę, aby wywołać funkcję przerwania).

W systemie operacyjnym DOS (lub systemie, który zapewnia pewną emulację DOS, na przykład konsola Windows), wartość Int 0x21 jest odwzorowana na to, co jest faktycznie głównym interfejsem API systemu operacyjnego DOS. Dostarczając różne wartości do rejestru AH, można wykonywać różne funkcje DOS, takie jak otwieranie pliku (AH = 0x3D) lub drukowanie na ekranie (AH = 0x09).

+1

Konsola systemu Windows nie wykonuje emulacji systemu DOS - aplikacje w trybie konsoli są pełnowartościowymi aplikacjami z 32-bitowym systemem Windows. 'command.com! = cmd.exe' :) - 32-bitowe wersje systemu Windows mają jednak NTVDM, który oferuje emulację DOS. – snemarch

1

To "przerwanie oprogramowania"; więc w ogóle nie przerwać sprzęt.

Gdy aplikacja wywołuje przerwanie programowe, jest to zasadniczo to samo co wywołanie podprogramu, z tym że (w przeciwieństwie do wywołania podprogramu) nie musi znać dokładnego adresu pamięci kodu, który wywołuje.

Oprogramowanie systemowe (np. DOS i BIOS) udostępniają swoje interfejsy API aplikacji jako przerwania programowe.

Przerwanie oprogramowania jest zatem rodzajem dynamicznego łączenia.

9

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.

0

Faktycznie, istnieje wiele pojęć tutaj. Zacznijmy od podstaw.

Przerwanie jest środkiem do zwracania uwagi od procesora, do przerwania bieżącego przepływu programu, przejścia do obsługi przerwań (ISR - procedura przerwania), wykonania pewnych czynności (zwykle przez jądro systemu operacyjnego lub urządzenie sterownik), a następnie powrócić.

Jakie są typowe zastosowania przerwań?

  • Przerwania sprzętowe: urządzenie żąda uwagi od procesora, wysyłając żądanie przerwania.
  • Wyjątki procesora: Jeśli wystąpi jakaś nietypowa sytuacja procesora, na przykład dzielenie przez zero, błąd strony, ... CPU przeskakuje do odpowiedniego programu obsługi przerwań, aby system operacyjny mógł zrobić wszystko, co ma do zrobienia (wysłać sygnał do proces, załaduj stronę z wymiany i zaktualizuj tabelę TLB/stronę, ...).
  • Przerwania w oprogramowaniu: Ponieważ przerwanie wywołuje jądro systemu operacyjnego, prostym sposobem implementacji wywołań systemowych jest użycie przerwań. Ale nie musisz, w x86 możesz użyć instrukcji wywołania do jakiejś struktury (jakiś rodzaj TSS IIRC), a na nowszym x86 istnieją intrukcje SYSCALL/SYSENTER.

Procesory decydują, gdzie przejść do patrzenia na tabelę (wektory wyjątku, wektory przerwań, IVT w trybie rzeczywistym x86, IDT w trybie chronionym x86, ...). Niektóre procesory mają jeden wektor dla przerwań sprzętowych, inny dla wyjątków i tak dalej, a ISR musi wykonać pewną pracę, aby zidentyfikować twórcę przerwania. Inne mają wiele wektorów i przeskakują bezpośrednio do bardzo specyficznych ISR.

x86 ma 256 wektorów przerwań. Na oryginalnych komputerach podzielono je na kilka grup:

  • 00-04 Wyjątki procesora, w tym NMI. W późniejszych procesorach (80186, 286, ...) zakres ten rozszerzył się, pokrywając się z następującymi zakresami.
  • 08-0F Są to przerwania sprzętowe, zwykle określane jako IRQ0-7. PC-AT dodał IRQ8-15
  • 10-1F Połączenia BIOS. Koncepcyjnie można je uznać za wywołania systemowe, ponieważ BIOS jest częścią DOS, która zależy od konkretnej maszyny (tak było zdefiniowane w CP/M).
  • 20-2F Połączenia DOS. Niektóre z nich są multipleksowane i oferują wiele funkcji. Głównym jest INT 21h, który oferuje większość usług DOS.
  • 30-FF Reszta, do użytku z zewnętrznymi sterownikami i programami użytkownika.